小编ado*_*oss的帖子

在C++ Win32中创建透明窗口

我正在创建一个非常简单的Win32 C++应用程序,它的唯一目的就是只显示一个半透明的PNG.窗口不应该有任何镶边,并且所有不透明度都应该在PNG本身中控制.

我的问题是当窗口下的内容发生变化时,窗口不会重新绘制,因此PNG的透明区域与应用程序最初启动时窗口下的内容"卡住".

这是我设置新窗口的行:

hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
Run Code Online (Sandbox Code Playgroud)

对于RegisterClassEx的调用,我有这个背景集:

wcex.hbrBackground = (HBRUSH)0;
Run Code Online (Sandbox Code Playgroud)

这是WM_PAINT消息的处理程序:

 case WM_PAINT:
 {
   hdc = BeginPaint(hWnd, &ps);
   Gdiplus::Graphics graphics(hdc);
   graphics.DrawImage(*m_pBitmap, 0, 0);
   EndPaint(hWnd, &ps);
   break;
 }
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,应用程序始终停靠在屏幕左侧,不会移动.但是,当用户打开,关闭或移动其下的窗口时,应用程序下面的内容可能会发生变化.

当应用程序首次启动时,它看起来很完美.PNG的透明(和类似透明)部分完美展现.但是,当应用程序下面的背景发生变化时,后台不会更新,它会在应用程序首次启动时保持不变.实际上,WM_PAINT(或WM_ERASEBKGND在后台更改时不会被调用).

我已经玩了很长一段时间了,已经接近100%正确,但不是那里.例如,我尝试将背景设置为(HBRUSH)NULL_BRUSH,我尝试处理WM_ERASEBKGND.

当窗口下的内容发生变化时,可以做些什么来重新绘制窗口?

c++ winapi transparency gdi+ alphablending

44
推荐指数
2
解决办法
5万
查看次数

标签 统计

alphablending ×1

c++ ×1

gdi+ ×1

transparency ×1

winapi ×1