我正在创建一个应该非常简单的Win32 C++应用程序,其唯一目的是仅显示一个半透明的PNG。窗口不应该有任何装饰,并且所有不透明度都应该在PNG本身中控制。
我的问题是,当窗口下方的内容更改时,窗口没有重新绘制,因此PNG的透明区域会“卡住”初始启动应用程序时在窗口下方的内容。
这是我设置新窗口的代码行:
hWnd = CreateWindowEx(WS_EX_TOPMOST, szWindowClass, szTitle, WS_POPUP, 0, height/2 - 20, 40, 102, NULL, NULL, hInstance, 0);
对于调用RegisterClassEx,我将此设置为背景:
wcex.hbrBackground = (HBRUSH)0;
这是我处理WM_PAINT消息的代码:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics graphics(hdc);
graphics.DrawImage(*m_pBitmap, 0, 0);
EndPaint(hWnd, &ps);
break;
}
需要注意的一点是应用程序始终停靠在屏幕的左侧并且不会移动。但是,当用户在其下打开、关闭或移动窗口时,位于应用程序下方的内容可能会发生变化。
当应用程序首次启动时,它看起来完美。PNG 图像中透明(半透明)部分完全透过。但是,当 应用程序下方的背景发生更改时,背景没有更新,仍然保持应用程序启动时的状态。实际上,WM_PAINT(或 WM_ERASEBKGND 在背景更改时不会被调用)。
我已经尝试了很长时间,并接近达到100%的正确性,但还没有完全成功。例如,我已经尝试将背景设置为 (HBRUSH) NULL_BRUSH 并尝试处理 WM_ERASEBKGND。
有什么方法可以让窗口在其下方的内容发生更改时重新绘制?