Win32窗口设置为透明

可以使用以下方法将Win32窗口设置为透明:

  1. 定义窗口类时,在WNDCLASSEX结构体中设置hbrBackground成员为NULL。

  2. 在窗口创建时,使用WS_EX_LAYERED风格和SetLayeredWindowAttributes函数将窗口设置为透明:

HWND hwnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);

SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);

其中,第二个参数指定颜色偏移量,第三个参数指定透明度,范围从0(完全透明)到255(完全不透明)。

  1. 在窗口的WM_PAINT消息处理函数中,使用CreateCompatibleDC函数创建一个与窗口DC兼容的内存DC,并将要绘制的图形绘制到该内存DC上。然后使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中。
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);

    // 创建与窗口DC兼容的内存DC
    HDC memDC = CreateCompatibleDC(hdc);

    // 创建一个与窗口大小相同的位图
    HBITMAP memBmp = CreateCompatibleBitmap(hdc, 500, 100);

    // 将位图选入内存DC
    HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);

    // 在内存DC中绘制图形
    // ...

    // 使用UpdateLayeredWindow函数将内存DC中的内容复制到窗口DC中
    POINT ptSrc = { 0, 0 };
    SIZE size = { 500, 100 };
    BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
    POINT ptDst = { 0, 0 };

    UpdateLayeredWindow(hwnd, hdc, &ptDst, &size, memDC, &ptSrc, 0, &blend, ULW_ALPHA);

    // 恢复原来的位图
    SelectObject(memDC, oldBmp);

    // 释放内存DC和位图
    DeleteDC(memDC);
    DeleteObject(memBmp);

    EndPaint(hwnd, &ps);
}
break;

以上代码中,在内存DC中绘制图形的过程自行实现。另外,由于UpdateLayeredWindow函数需要使用内存DC和位图,因此需要在WM_DESTROY消息处理函数中释放这些资源:

case WM_DESTROY:
{
    PostQuitMessage(0);
    DeleteObject(hBrush);
    DeleteObject(hPen);
    DeleteObject(hFont);
    DeleteObject(hImage);

    // 释放内存DC和位图
    HDC memDC = GetDC(hwnd);
    ReleaseDC(hwnd, memDC);
}
break;

posted on   百足Coder  阅读(1499)  评论(1编辑  收藏  举报

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示