c++ - 为什么当窗口在 win32 上失去焦点时,覆盖的非客户区显示默认值?

标签 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;

这就是诀窍,在上面的例子中,我在窗口周围绘制了一个红色矩形。 但是,如果窗口失去焦点,则会绘制默认的非客户区,而我自定义的非客户区绘图也会消失。

我已经尝试在我的窗口的回调函数中捕获消息 WM_KILLFOCUS 并对其执行与我对 WM_NCPAINT 相同的操作,但它没有执行任何操作(尽管我看到当我按下另一个窗口和我的窗口时收到此消息损失焦点)。

我在这里错过了什么......?

最佳答案

WM_NCACTIVATE 添加处理程序:

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

关于c++ - 为什么当窗口在 win32 上失去焦点时,覆盖的非客户区显示默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641357/

相关文章:

c - 如何让EUDC在不重启的情况下生效?

Windows 内核驱动程序 : Does the "HANDLE UniqueThread" in "CLIENT_ID CreatingThreadId" is the same during the process loading?

c++ - 在客户端矩形中隐藏光标但不在标题栏上

c++ - move ctor和 move dtor

c++ - LocalAlloc 和 LocalRealoc 用法

c++ - shared_ptr : do I need two or only one 中的常量

c++ - QTextEdit:获取鼠标指针下的单词

c++ - ARRAY[T, SIZE] 可用的适当默认构造函数

c++ - wxWidgets 显示来自 8 位数组的位图

vba - 执行 URLDownloadToFile 函数返回 E_ACCESSDENIED 公司网络上的一般访问被拒绝错误 0x80070005