如何在win32中在不覆盖标题栏的情况下围绕窗口绘制矩形

How can I paint a rectangle around a window without overriding the title bar in win32

本文关键字:窗口 情况下 绘制 标题栏 win32 覆盖      更新时间:2023-10-16

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

    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);

但这只会导致标题栏根本没有画出来(是黑色的)。

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

如果你想绘制原始标题栏,那么你需要首先调用DefWindowProc(),然后在它绘制的内容的"顶部"绘制自己的内容。

如果您希望用一个矩形同时绘制整个非客户端区域,则可能还需要使用ExcludeClipRect()来防止客户端区域被绘制。

相关文章: