win32-UpdateLayeredWindow

摘要:
标准时间>HDChdc);lParam);//InitializeGDI+GdiplusStartup(&hinst=GetModuleHandle(NULL);wc.lpfnWndProc=WndProc;寄存器类(&GetDC(hWnd));而(GetMessage(&0)){TranslateMessage(&aamp;

创建半透明的窗口,以及在窗口上绘制不透明的文本

方法:

  1. 创建Bitmap具有PixelFormat32bppPARGB像素格式的GDI + 对象
  2. 创建一个Graphics对象以绘制该Bitmap对象。
  3. 使用GDI +将所有图形绘制到该对象中。
  4. 销毁Graphics在步骤2中创建对象。
  5. GetHBITMAPBitmap对象调用方法以获取Windows HBITMAP
  6. 销毁Bitmap对象。
  7. 使用创建内存DC,CreateCompatibleDC然后HBITMAP从步骤5中选择
  8. 使用内存DC作为源调用UpdateLayeredWindow。
  9. 选择以前的位图并删除内存DC。
  10. 销毁HBITMAP在步骤5中创建的。

代码示例:

#include <Windows.h>
#include <stdio.h>
#include <iostream>
#include <ObjIdl.h>
#include <gdiplus.h>
#include <gdiplusheaders.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.lib")

#define MAX_WIDTH 800
#define MAX_HEIGHT 600

using namespace std;

void Drawtext(HWND hwnd, HDC hdc);

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    if (message == WM_DESTROY) {

        PostQuitMessage(0);
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
};

HINSTANCE hinst;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance, PSTR szCmdLine, int iCmdShow) {
    HWND hWnd;
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;

    //Initialize GDI+
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    hinst = GetModuleHandle(NULL);
    // create a window class:
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hinst;
    wc.lpszClassName = L"win32";

    // register class with operating system:
    RegisterClass(&wc);

    // create and show window:
    hWnd = CreateWindowExW(
        WS_EX_LAYERED | WS_EX_TOPMOST,
        L"win32",
        L"WinSoup",
        WS_POPUP,
        0, 0, 1000, 500,
        nullptr,
        nullptr,
        hInstance,
        nullptr
    );

    if (hWnd == NULL) {
        return 0;
    }

    Drawtext(hWnd, GetDC(hWnd));

    ShowWindow(hWnd, SW_SHOW);


    MSG msg = {};

    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

}

void Drawtext(HWND hwnd, HDC hdc)
{
    FontFamily  fontFamily(L"Times New Roman");
    Font        font(&fontFamily, 32, FontStyleRegular, UnitPixel);
    PointF      pointF(30.0f, 10.0f);
    SolidBrush  solidBrush(Color(255, 0, 0, 0));

    Bitmap softwareBitmap(MAX_WIDTH, MAX_HEIGHT, PixelFormat32bppARGB);
    Graphics g(&softwareBitmap);

    g.Clear(Gdiplus::Color(30, 0, 0, 0));  // 30: alpha value 

    g.DrawString(L"Hello Hello Hello Hello Hello Hello Hello Hello", -1, &font, pointF, &solidBrush);

    HBITMAP bmp;
    softwareBitmap.GetHBITMAP(Color(0, 0, 0, 0), &bmp);

    HDC memdc = CreateCompatibleDC(hdc);
    HGDIOBJ original = SelectObject(memdc, bmp);


    BLENDFUNCTION blend = { 0 };
    blend.BlendOp = AC_SRC_OVER;
    blend.SourceConstantAlpha = 255;
    blend.AlphaFormat = AC_SRC_ALPHA;
    POINT ptLocation = { 200, 300 };
    SIZE szWnd = { MAX_WIDTH, MAX_HEIGHT };
    POINT ptSrc = { 0, 0 };
    BOOL l = UpdateLayeredWindow(hwnd, hdc, &ptLocation, &szWnd, memdc, &ptSrc, 0, &blend, ULW_ALPHA);
    int err = GetLastError();
    SelectObject(hdc, original);

    DeleteObject(bmp);
    DeleteObject(memdc);
}

免责声明:文章转载自《win32-UpdateLayeredWindow》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dll相关(二)2017iOS开发最新的打包测试步骤(亲测)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC/HALCON混合编程系列一_相机打开图像_简单处理_

1.说明         通过相机打开一幅图像,然后处理此图像并显示最终结果。使用的Hdevelop的代码如下:   从Hdevelop导出的C++代码如下: /////////////////////////////////////////////////////////////////////////////// // File generated...

SSH框架使用注解简化代码

注释的优势:     1.最简单直接的优势就是减少了配置文件的代码量。     2.注释和Java代码位于一个文件中,而XML 配置采用独立的配置文件。配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。  SSH 注解组...

一个漂亮的输出MySql数据库表结构的PHP页面

经常为了方便和直观,我们会首先直接在数据库中设计出表,但是接下来又要将表的结构和设计编写在设计文档中,以便编码的时候可以直观的查询,一旦数据库表非常多,字段非常多的时候,这无疑是件非常郁闷的工作。 这是一个漂亮的PHP页面,可以自动输出MySql数据库所有表结构,大大方便了文档的编写工作,也同时非常方便编码的时候进行查询。当然在设计MySql数据库表和字段...

JS实现 Tab栏切换案例

要求:当鼠标点击上面相应的选项卡(tab),下面页面的内容也随之而改变。 结构分析:   全部的内容都放到一个大的盒子里面,盒子里面又可以分为上面和下面两个盒子。   上面的盒子放了 5个li,装着5个小的选项卡,默认会有一个被选中;   下面的盒子也包含了 5个 div 模块,模块内容与上面的选项一一对应,当前默认的只有第一个 div会被显示出来。 实现...

PowerShell脚本之Invoke-Expression Hook

目录 PowerShell脚本之Invoke-Expression Hook 开发环境 Hook的起因 Hook的原理 Hook的流程 patch程序的编写 0x01--原始DLL的修改 0x02--3环程序的编写 0x03--驱动程序的编写 0x04--总结和梳理: 效果展示 PowerShell脚本之Invoke-Expressio...

spring boot项目使用外部tomcat启动失败总结

1. springboot的tomcat使用外部提供的. <!-- 打war包时加入此项, 告诉spring-boot tomcat相关jar包用外部的,不要打进去 --> dependency> <groupId>org.springframework.boot</groupId> <arti...