在 Win32 中平滑 WM_NCPAINT

Smooth WM_NCPAINT in Win32

我想处理 WM_NCPAINT 消息来绘制我自己的 window 框架。我写了一些简单的代码来绘制一个矩形,它应该在它周围有一个黑色边框。这是代码:

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);
}

但是,这有几个问题。在左边缘或上边缘调整 window 大小时,它会导致 window 在下边缘和右边缘严重闪烁。第二个问题是window的上角有圆角,我画的地方好像没有。 (这是 Windows10)。 据我了解,不应该有任何闪烁,因为我在收到 WM_NCPAINT 消息后立即绘制 window,但似乎并非如此。 谁能告诉我我做错了什么以及如何避免这些问题?

顺便说一句,这是左上角和右上角的圆角。

经过更多的搜索,我找到了解决方案。起初我有点怀疑。我将以下代码添加到我的 WM_NCCREATE:

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

这修复了闪烁和恼人的圆角问题。