我有一个具有自定义边框/标题的窗口,为此我处理WM_NCPAINT消息。我的标题有两个背景,一个用于活动窗口,另一个用于背景窗口。
但在某些情况下,例如当窗口失去/获得焦点时,我的标题不会更新,所以我以错误的背景结束。
到目前为止,我已经处理了WM_NCACTIVATE,并发送了RedrawWindow(hwnd,NULL,NULL,RDW_FRAME | RDW_INVALIDATE),但这会导致整个窗口重新绘制。你有什么建议吗?
答案 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。它可能不会使客户区无效。