Плавный WM_NCPAINT в Win32 - PullRequest
       273

Плавный WM_NCPAINT в Win32

0 голосов
/ 05 мая 2020

Я хочу обрабатывать сообщения WM_NCPAINT, чтобы нарисовать свою собственную рамку окна. Я написал простой код для рисования прямоугольника, который должен иметь черную рамку вокруг него. Вот код:

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_NCPAINT:
        {
            RECT rc;
            GetWindowRect(hWnd, &rc);
            HDC hDC = GetWindowDC(hWnd);
            Rectangle(hDC, 0, 0, rc.right - rc.left, rc.bottom - rc.top);
            ReleaseDC(hWnd, hDC);
            return TRUE;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }
    }
    return DefWindowProc(hWnd, msg, wParam, lparam);
}

Однако с этим возникла пара проблем. При изменении размера окна по левому или верхнему краю окно сильно мигает по нижнему и правому краям. Вторая проблема заключается в том, что в верхних углах окна есть закругленные углы, где моя роспись, кажется, не проходит. (Это Windows 10). Насколько я понимаю, мерцания быть не должно, так как я рисую окно сразу после получения сообщения WM_NCPAINT, что, похоже, не так. Может ли кто-нибудь сказать мне, что я делаю не так и как избежать этих проблем?

Кстати, вот как выглядят закругленные углы в верхнем левом и верхнем правом углах. Window rounded corners

1 Ответ

0 голосов
/ 05 мая 2020

После еще нескольких поисков я нашел решение. Сначала я был настроен немного скептически. Я добавил в свой WM_NCCREATE следующий код:

HMODULE uxtheme = LoadLibrary("uxtheme.dll");
HRESULT __stdcall (* SetWindowTheme) (HWND, LPWSTR, LPWSTR) = GetProcAddress("SetWindowTheme");
SetWindowTheme(uxtheme, L" ", L" ");
FreeLibrary(uxtheme);

Это исправляет как мерцание, так и раздражающие закругленные углы.

...