平滑WM_NCPAINT在Win32中的应用。

问题描述 投票:0回答:1

我想处理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

windows winapi win32gui nonclient-area
1个回答
0
投票

经过一番搜索,我找到了解决方案。一开始我还有点怀疑。我在WM_NCCREATE中添加了以下代码。

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

这样既解决了闪烁的问题,也解决了恼人的圆角问题。

© www.soinside.com 2019 - 2024. All rights reserved.