我正在创建一个非常简单的 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。
当窗口下面的内容发生变化时,可以做什么来让窗口重新绘制?