当窗口失去对win32的关注时,为什么被覆盖的非客户区显示默认值?

Gid*_*idi 6 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);
        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;
Run Code Online (Sandbox Code Playgroud)

这样就可以了,在上面的例子中,我的窗口周围画了一个红色矩形.但是,如果窗口失去焦点,则会绘制默认的非客户区域,并且我的自定义非客户区域图形将消失.

我已经尝试在我的窗口的回调函数中捕获消息WM_KILLFOCUS并使用它与WM_NCPAINT一样,但它没有做任何事情(虽然我看到当我按下另一个窗口并且我的窗口失去焦点时收到此消息) .

我在这里想念的是什么......?

arx*_*arx 5

添加处理程序WM_NCACTIVATE:

case WM_NCACTIVATE:
    // Paint the non-client area now, otherwise Windows will paint its own
    RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW);
    break;
Run Code Online (Sandbox Code Playgroud)