winapi - 抑制 WM_ERASEBKGND 的正确方法是什么?

标签 winapi doublebuffered

如果我需要使用双缓冲,我需要抑制 WM_ERASEBKGND 消息。

我可以处理WM_ERASEBKGND并立即返回。但是我可以将 WNDCLASS/WNDCLASSEXhbrBackground 设置为 NULL 并且不处理 WM_ERASEBKGND 消息?这是正确的方法吗?

最佳答案

是的,将 hbrBackground 设置为 NULL 是避免实现无操作 WM_ERASEBKGND 处理程序的适当方法。

当您将 WM_ERASEBKGND 传递给 DefWindowProc 时,它会检查窗口类中的背景画笔。如果有的话,它就会用它填充脏区域。如果背景画笔为空,则不执行任何操作并返回。这本质上与拥有自己的不执行任何操作的 WM_ERASEBKGND 处理程序相同。

WM_ERASEBKGND 处理程序的返回值会影响 WM_PAINT 调用时获取的 PAINTSTRUCTfErase 字段开始绘制WM_PAINT 处理程序应该检查 fErase 以查明是否需要删除背景本身,或者是否已由 WM_ERASEBKGND 完成。 (虽然我从未真正见过有人检查过它。)如果您让 DefWindowProc 处理 WM_ERASEBKGND ,如果它有颜色编号,它将返回 TRUE如果 hbrBackgroundNULL,则刷子和 FALSE

关于winapi - 抑制 WM_ERASEBKGND 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12073721/

相关文章:

c++ - 尝试清除特定票证时,LsaCa​​llAuthenticationPackage 返回 ERROR_INVALID_PARAMETER 87 (0x57)

c++ - WinApi 相当于 .NET KeyPreview

c# - 从一个 winform 切换到另一个时面板闪烁

c++ - Windows API,__declspec(thread) vs CreateThread?

c++ - Win32 写入文件 : Access Viloation and Error 1784

c# - 制作无闪烁动画 C# 自定义控件的最佳方法是什么?

c++ - 为什么我在控制台做双缓冲时会出现随机符号?

DirectX 视频闪烁

delphi - 如何消除TPaintBox右边缘的闪烁(例如调整大小时)

c++ - 设置/删除窗口子类时正确传递/删除数据