C++ 当窗口在win32上失去焦点时,为什么覆盖的非客户端区域显示默认值?
我在窗口的回调函数中覆盖了窗口的非客户端区域,如下所示:C++ 当窗口在win32上失去焦点时,为什么覆盖的非客户端区域显示默认值?,c++,winapi,C++,Winapi,我在窗口的回调函数中覆盖了窗口的非客户端区域,如下所示: 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);
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);
RedrawWindow(hWnd,&rect,(HRGN)wParam,RDW_UPDATENOW)
}break;
这就完成了,在上面的例子中,我在窗口周围画了一个红色矩形。
但是,如果窗口失去焦点,则会绘制默认的非客户端区域,并且我的自定义非客户端区域图形将消失
我尝试在我的窗口的回调函数中捕获消息WM_KILLFOCUS,并对其执行与WM_NCPAINT相同的操作,但它没有执行任何操作(尽管我在按下另一个窗口时看到收到此消息,我的窗口失去焦点)
我在这里遗漏了什么…?为
WM\u NCACTIVATE
添加一个处理程序:
case WM_NCACTIVATE:
// Paint the non-client area now, otherwise Windows will paint its own
RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW);
break;
NC绘制不是那么简单,主题化使其不切实际。很多问题。DeleteObject()调用不会删除该对象。它是在设备上下文中选择的。您必须恢复DC。保存SelectObject()的返回值,并在绘制后再次调用SelectObject以恢复旧笔。另外,你的代码应该100%烧掉内核,重画窗口会导致再次生成WM_NCPAINT。不要帮太多忙,WM_PAINT完成了任务。如果我删除
WM_NCPAINT
末尾的重画窗口,那么当我重新调整窗口大小时,正在重新调整大小的非客户端区域(鼠标所持的边框)将消失-我看不到默认值,也看不到自定义非客户端区域。当我完成重新调整大小(放开鼠标)时,自定义非客户端区域返回。如果我离开WM_NCPAINT
末尾的重画窗口
,则在重新调整大小时也会绘制自定义非客户端区域。我已经检查了重画窗口和不重画窗口对CPU的影响,没有发现显著差异。