我想在窗口周围绘制一个矩形,但我不想覆盖标题栏。 到目前为止我在窗口回调函数中编写的是:
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()
如果您希望使用单个矩形一次绘制整个非客户区域,以防止客户区域被绘制。
关于c++ - 如何在窗口周围绘制矩形而不覆盖 win32 中的标题栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25552611/