使非客户区域无效

时间:2010-05-12 14:52:11

标签: c++ windows gdi

我有一个具有自定义边框/标题的窗口,为此我处理WM_NCPAINT消息。我的标题有两个背景,一个用于活动窗口,另一个用于背景窗口。

但在某些情况下,例如当窗口失去/获得焦点时,我的标题不会更新,所以我以错误的背景结束。

到目前为止,我已经处理了WM_NCACTIVATE,并发送了RedrawWindow(hwnd,NULL,NULL,RDW_FRAME | RDW_INVALIDATE),但这会导致整个窗口重新绘制。你有什么建议吗?

2 个答案:

答案 0 :(得分:4)

实际上,这就是诀窍:

SetWindowPos(hwnd, 0, 0, 0, 0, 0,
    SWP_DRAWFRAME|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER);

答案 1 :(得分:3)

覆盖非客户区域总是充满危险。似乎Window管理器对优化做了很多假设。显然可以完成,请参阅Office,但可能需要进行大量实验。

只是一个想法。调用RedrawWindow两次,一次使非客户区无效,然后再次验证客户区。

RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
RedrawWidnow(hwnd, NULL, NULL, RDW_NOFRAME | RDW_VALIDATE);

另一个想法是尝试立即绘制框架,而不会使任何内容失效:

RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_UPDATENOW | RDW_NOCHILDREN);

另一个想法是在第二个或第三个参数中指定一个空的RECT或HREGION。它可能不会使客户区无效。