c++ - 使非客户区无效

标签 c++ windows gdi

我有一个具有自定义边框/标题的窗口,为此我处理 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/

相关文章:

c++ - Eigen::Tensor,如何从 Tensor 访问矩阵

c++ - 我可以在 C++ 中通过 operator[] 正确设置 std::vector 的第 n 个值吗?

c++ - __cdecl 或 __stdcall 在 Windows 上?

c - BeginPaint() 不删除背景

windows - 远程桌面中的物理屏幕分辨率大小更改

c++ - 创建 GDI 矩形图像

c++ - make_shared是否为每个成员变量做一个默认的初始化(零初始化)

c++ - 在 C++ 中,我如何知道一个数组包含多少个元素?

android - 使用 git bash (Windows) 下载 lexandera/Aardwolf.git; fatal error - 无法连接到 github.com

windows - 如何在配备 Tesla 的基于 Windows 的主机上使用 OpenGL 进行渲染