【问题标题】:How can I paint a rectangle around a window without overriding the title bar in win32如何在窗口周围绘制一个矩形而不覆盖 win32 中的标题栏
【发布时间】:2025-12-14 14:00:02
【问题描述】:

我想在我的窗口周围画一个矩形,但我不想覆盖标题栏。 到目前为止我在窗口回调函数中写的是:

    case WM_NCPAINT:
    {
        HDC hdc;
        RECT rect;
        HPEN pen;

        hdc=GetDCEx(hWnd,(HRGN)wParam,DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_LOCKWINDOWUPDATE);
        GetWindowRect(hWnd,&rect);
        pen=CreatePen(PS_SOLID, 10, RGB(255, 0, 0));//red pen 10 pixels in size
        SelectObject(hdc,pen);
        Rectangle(hdc,0,0,(rect.right-rect.left),(rect.bottom-rect.top));
        DeleteObject(pen);
        ReleaseDC(hWnd,hdc);
    }
    break;

但是,这会用白色画笔在窗口标题栏上绘制。

我怎样才能让它不在标题栏上绘画?我丢失了标题栏文本和菜单...

我在创建笔之前尝试使用 HOLLOW_BRUSH,如下所示:

        HBRUSH b=CreateSolidBrush(HOLLOW_BRUSH);
        SelectObject(hdc,b);

但这只会导致标题栏根本不被绘制(黑色)。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    通过处理WM_NCPAINT 消息,您告诉窗口管理器您负责绘制整个非客户区,因此窗口管理器不会为您绘制任何内容。

    如果你想绘制原始标题栏,那么你需要先调用DefWindowProc(),然后在它所绘制的“顶部”进行自己的绘制。

    如果您希望使用单个矩形一次绘制整个非客户区,您可能还需要使用ExcludeClipRect() 来防止客户区被覆盖。

    【讨论】: