WM_PAINT, управляемый системой win32-gdi, не мерцает?

запуск этого кода приводит к заголовку вопроса:

если вы измените размер окна, вы не увидите никакого мерцания (перерисовка, отправленная системой)

если вы переместите мышь внутри окна, произойдет сильное мерцание (перерисовка прислана мной)

как воспроизвести системный 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;
}

person freesoft    schedule 10.03.2021    source источник
comment
Комментарии не для расширенного обсуждения; этот разговор был перешел в чат.   -  person Machavity♦    schedule 12.03.2021


Ответы (1)


Вы не должны делать окно недействительным, если мышь перемещается только по нему, потому что это в конечном итоге приведет к сообщению WM_PAINT. Это вызывает мерцание (в сочетании со сном).

person guest    schedule 11.03.2021
comment
WM_PAINT всегда аннулирует все, но после WM_SIZE окна не будут мерцать. - person freesoft; 11.03.2021