Windows 在Win32中平滑WM_NCPAINT

Windows 在Win32中平滑WM_NCPAINT,windows,winapi,win32gui,nonclient-area,Windows,Winapi,Win32gui,Nonclient Area,我想处理WM_NCPAINT消息以绘制自己的窗框。我写了一些简单的代码来画一个矩形,它周围应该有一个黑色的边框。代码如下: LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ case WM_NCPAINT: { RECT rc; GetWindowRect(hWnd, &rc)

我想处理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消息后立即绘制窗口,但情况似乎并非如此。 有人能告诉我我做错了什么以及如何避免这些问题吗

顺便说一下,这就是圆角的样子,在左上角和右上角。

在进一步搜索之后,我找到了解决方案。一开始我有点怀疑。我将以下代码添加到我的WM_NCCREATE中:

HMODULE uxtheme = LoadLibrary("uxtheme.dll");
HRESULT __stdcall (* SetWindowTheme) (HWND, LPWSTR, LPWSTR) = GetProcAddress("SetWindowTheme");
SetWindowTheme(uxtheme, L" ", L" ");
FreeLibrary(uxtheme);
这修复了闪烁和恼人的圆角