绘制非客户区的问题 - Win32

Problem with painting non client area - Win32

我正在尝试创建自定义非客户区。

所以我在 WndProc 方法中处理 WM_NCPAINT 消息,并尝试在非客户区创建一个红色矩形,但我发现了两个问题。

  1. 我在非客户区画的矩形也覆盖了客户区

所以为了遇到它,我在 WM_NCPAINT 消息的末尾添加了 RedrawWindow 函数,但我不确定这是个好主意。我还能做些什么来纠正这个问题?

  1. 我多次调整 window 大小时得到一些奇怪的结果。我就是不知道怎么解释,不过我试试

这是我目前所取得的成就

但是如果我连续多次调整它的大小(比如 10 - 15),它就会得到这个

全图是window(第一个)的截图。 我不知道这是怎么回事。白色部分画错了,右边和底部看起来是透明的,但都是一张window的截图。 (SS 通过截图工具)

鼠标点击全部通过透明部分

Window 可以很好地调整大小,但其中没有正确绘制任何内容,大小不正确。 绘图的大小设置为某个最大大小(不知道是什么,它是随机的)。

代码与visual studio的Windows Desktop Application C++模板默认代码相同。

刚刚为 WM_NCPAINT 消息添加了自定义代码。

case WM_NCPAINT:
{
    HDC hdc = GetWindowDC(hWnd);
    if (hdc) {
        RECT frame = { 0 };
        GetWindowRect(hWnd, &frame);
        frame.right = frame.right - frame.left;
        frame.bottom = frame.bottom - frame.top;
        frame.left = 0;
        frame.top = 0;
        FillRect(hdc, &frame, CreateSolidBrush(RGB(255, 0, 0)));
        ReleaseDC(hWnd, hdc);
        RedrawWindow(hWnd, &frame, (HRGN)wParam, RDW_UPDATENOW);
    }
    return 0;
}

IInspectable 的评论对我有帮助。

来自 CreateSolidBrush:“当您不再需要 HBRUSH 对象时,调用 DeleteObject 函数将其删除。”您没有这样做那,并在每个 WM_NCPAINT 回调中泄漏一个 HBRUSH。 GDI 资源是您的系统必须提供的最有限的资源之一。