如果我需要使用双缓冲,我需要抑制WM_ERASEBKGND
消息。
我可以处理WM_ERASEBKGND
并立即返回。但是我可以将WNDCLASS
/设置为而不处理消息吗WNDCLASSEX
?这是正确的方法吗?hbrBackground
NULL
WM_ERASEBKGND
如果我需要使用双缓冲,我需要抑制WM_ERASEBKGND
消息。
我可以处理WM_ERASEBKGND
并立即返回。但是我可以将WNDCLASS
/设置为而不处理消息吗WNDCLASSEX
?这是正确的方法吗?hbrBackground
NULL
WM_ERASEBKGND
是的,设置hbrBackground
为NULL
是避免实现无操作WM_ERASEBKGND
处理程序的适当方法。
当您传递WM_ERASEBKGND
到 时DefWindowProc
,它会检查窗口类中的背景画笔。如果有,它会用它填充脏区。如果背景画笔为空,则不执行任何操作并返回。这与拥有自己的无操作WM_ERASEBKGND
处理程序基本相同。
处理程序的返回值WM_ERASEBKGND
会影响您在调用时获得的fErase
字段。处理程序应该检查以确定它是否需要自行擦除背景,或者它是否已经由. (虽然我实际上从未见过任何人检查它。)如果你让句柄它会返回,如果它有一个颜色编号或画笔,如果是.PAINTSTRUCT
WM_PAINT
BeginPaint
WM_PAINT
fErase
WM_ERASEBKGND
DefWindowProc
WM_ERASEBKGND
TRUE
FALSE
hbrBackground
NULL
我相信设置hbrBackground = GetStockObject(HOLLOW_BRUSH)
比设置更正确NULL
。
关于 Raymond Chen 的 The Old New Thing 的一篇文章做出了区分:
如果您不想自动绘制背景,请通过空心画笔。如果您想要自定义背景绘图,则
NULL
作为画笔传递。
WNDCLASS
的成员的 MSDN 文档hbrBackground
说:
当此成员为
NULL
时,应用程序必须在请求在其客户区绘制时绘制自己的背景。要确定是否必须绘制背景,应用程序可以处理WM_ERASEBKGND
消息或测试由函数填充fErase
的结构的成员。PAINTSTRUCT
BeginPaint
该函数使用结构成员
DefWindowProc
指定的类背景画笔擦除背景。如果是,应用程序应该处理消息并清除背景。hbrBackground
WNDCLASS
hbrBackground
NULL
WM_ERASEBKGND
我的解释是,设置hbrBackground
然后NULL
忽略处理WM_ERASEBKGND
并不意味着严格合法(但可能有效);hbrBackground = NULL
是一个承诺,你会处理WM_ERASEBKGND
自己,而不是让DefWindowProc
尝试使用空指针进行绘制。