我有一个具有自定义边框/标题的窗口,为此我处理 WM_NCPAINT 消息。我的标题有两个背景,事件窗口的背景较亮,背景窗口的背景较暗。
但在某些情况下,例如当窗口失去/获得焦点时,我的标题没有更新,所以我以错误的背景结束。
到目前为止,我已经处理了 WM_NCACTIVATE,并发送了一个 RedrawWindow(hwnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE),但这会导致整个窗口重新绘制。您对此有什么建议吗?
最佳答案
覆盖非客户区总是充满危险。似乎窗口管理器为优化做了很多假设。显然它可以完成,请参阅 Office,但可能需要大量试验。
只是一个想法。调用 RedrawWindow 两次,一次使非客户区无效,然后再次使客户区有效。
RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
RedrawWindow(hwnd, NULL, NULL, RDW_NOFRAME | RDW_VALIDATE);
另一个想法是尝试立即只绘制框架,而不会使任何内容无效:
RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_UPDATENOW | RDW_NOCHILDREN);
还有一个想法是在第二个或第三个参数中指定一个空的 RECT 或 HREGION。它可能不会以这种方式使客户区无效。
关于c++ - 使非客户区无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819937/