Win32窗口设置为透明
  GwRZz48sCiBi 2023年11月01日 74 0

可以使用以下方法将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;
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: c++ win32 纤程 下一篇: 动态切换JDK8和JDK17
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  qcTZA6NUsJFb   2024年05月04日   86   0   0 Windows
  uYSwh3nnN5IT   2024年03月03日   113   0   0 Windows
  jMxGzq3drxo8   2024年03月12日   151   0   0 Windows
  dwB0rnCueyjo   2024年02月19日   107   0   0 Windows
GwRZz48sCiBi
作者其他文章 更多