【问题标题】:Problem with painting non client area - Win32绘制非客户区的问题 - Win32
【发布时间】:2021-12-15 11:59:36
【问题描述】:

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

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

  1. 我在非客户区绘制的矩形也覆盖了客户区。

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

  1. 我在多次调整窗口大小时得到了一些奇怪的结果。我只是不知道如何解释,但我尝试了

这是我目前所取得的成就

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

全图为窗口截图(第一张)。 我不知道发生了什么。白色部分画错了,右下角看起来是透明的,但都是一个窗口的截图。 (SS通过截图工具)

所有鼠标点击都穿过透明部分。

窗口的大小调整得很好,但没有正确地在其中绘制,而不是正确的大小。 绘图的大小设置为某个最大大小(不知道是什么,它是随机的)。

代码与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;
}

【问题讨论】:

  • 使用ExcludeClipRect剪掉你的客户矩形。
  • 来自CreateSolidBrush“当您不再需要HBRUSH 对象时,调用DeleteObject 函数将其删除。” 你没有这样做,并根据WM_NCPAINT 回调泄漏HBRUSH。 GDI 资源是您的系统必须提供的最有限的资源之一。
  • @JonathanPotter 感谢您的建议,但它给我带来了更多麻烦,除了我没有看到使用 Redraw Window 函数的任何下降,所以我保持原样。还是谢谢

标签: c user-interface winapi win32gui


【解决方案1】:

IInspectable 的评论对我有帮助。

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

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 2010-09-11
    • 2013-04-09
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-06-02
    相关资源
    最近更新 更多