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+)?

我用DrawDib显示图片为啥WM_PAINT会闪烁

来自 wchar_t* 的 C++ Win32 GDI+ 拉绳

win10电脑开机白屏任务栏闪烁

在Win64系统上动态加载无签名驱动:WIN64LUD

什么是回调,回调在编程中的含义