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的影响,没有发现显著差异。