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