win32-gdi系统驱动的WM_PAINT无闪烁吗?
Posted
技术标签:
【中文标题】win32-gdi系统驱动的WM_PAINT无闪烁吗?【英文标题】:Is win32-gdi system-driven WM_PAINT flicker free? 【发布时间】:2021-06-08 06:11:34 【问题描述】:运行此代码会导致标题问题:
如果您调整窗口大小,您将不会看到任何闪烁(系统发送的重绘)
如果你在窗口内移动鼠标,会出现严重的闪烁(重绘由我发送)
如何重现系统驱动的WM_PAINT?
#include <windows.h>
#include <wingdi.h>
LRESULT CALLBACK proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
switch(msg)
case WM_ERASEBKGND: return true;break;
case WM_MOUSEMOVE: InvalidateRect(hwnd, 0, 0); break;
case WM_PAINT:
InvalidateRect(hwnd,0,0);
HBRUSH b= CreateSolidBrush(0x000000ff);
HBRUSH c= CreateSolidBrush(0x0000ff00);
HBRUSH d= CreateSolidBrush(0x00ff0000);
RECT r;
GetClientRect(hwnd,&r);
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
FillRect(hdc,&r, b);
Sleep(10);
FillRect(hdc,&r, c);
` Sleep(10);
FillRect(hdc,&r,d);
EndPaint(hwnd,&ps);
DeleteObject(b);
DeleteObject(c);
DeleteObject(d);
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
return 0;
int main()
HWND hwnd=CreateWindow(WC_DIALOG,0,WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,500,500,0,0,0,0);
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)proc);
MSG msg;
while (true)
if (GetMessage(&msg, 0, 0, 0) != WM_CLOSE)
TranslateMessage(&msg);
DispatchMessage(&msg);
return 1;
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:如果鼠标只在窗口上方移动,则不应使窗口无效,因为这最终会导致 WM_PAINT 消息。这会导致闪烁(与睡眠相结合)。
【讨论】:
WM_PAINT 总是无效,但在 WM_SIZE 之后窗口不会闪烁。以上是关于win32-gdi系统驱动的WM_PAINT无闪烁吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Win32/GDI 加载 PNG 图像(如果可能,不要使用 GDI+)?