Win32窗口创建后设置背景色无法即时更新问题求助
Win32窗口设置类背景画刷后无法立即刷新的解决方法
你可以通过修改RedrawWindow的参数,添加强制擦除背景的标志来解决问题,修正后的代码如下:
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); // 保存旧画刷,后续可销毁避免内存泄漏 HBRUSH oldBrush = (HBRUSH)SetClassLongPtr(handle, GCLP_HBRBACKGROUND, (LONG_PTR)brush); // 新增RDW_ERASE标志,强制触发背景擦除消息 RedrawWindow(handle, nullptr, nullptr, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW); // 可选:若旧画刷非系统画刷,记得销毁 // if (oldBrush != nullptr && !IsSysColorBrush(oldBrush)) // DeleteObject(oldBrush);
问题原因
窗口的背景色绘制依赖WM_ERASEBKGND消息,该消息会使用窗口类关联的背景画刷填充背景。你原本的RedrawWindow调用缺少RDW_ERASE标志,仅标记窗口区域无效并立即更新,但没有触发背景擦除流程,因此新的背景画刷不会生效。只有当窗口调整大小时,系统会自动发送WM_ERASEBKGND消息,此时才会应用新的画刷。
替代方案
也可以用InvalidateRect结合UpdateWindow实现同样的效果,InvalidateRect的第三个参数设为TRUE会强制擦除背景:
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255)); HBRUSH oldBrush = (HBRUSH)SetClassLongPtr(handle, GCLP_HBRBACKGROUND, (LONG_PTR)brush); InvalidateRect(handle, nullptr, TRUE); UpdateWindow(handle); // 可选销毁旧画刷 // if (oldBrush != nullptr && !IsSysColorBrush(oldBrush)) // DeleteObject(oldBrush);
内容的提问来源于stack exchange,提问作者Gru
相关产品推荐
相关产品推荐

