4

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

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

4

2 回答 2

5

是的,设置hbrBackgroundNULL是​​避免实现无操作WM_ERASEBKGND处理程序的适当方法。

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

处理程序的返回值WM_ERASEBKGND会影响您在调用时获得的fErase字段。处理程序应该检查以确定它是否需要自行擦除背景,或者它是否已经由. (虽然我实际上从未见过任何人检查它。)如果你让句柄它会返回,如果它有一个颜色编号或画笔,如果是.PAINTSTRUCTWM_PAINTBeginPaintWM_PAINTfEraseWM_ERASEBKGNDDefWindowProcWM_ERASEBKGNDTRUEFALSEhbrBackgroundNULL

于 2012-08-22T13:03:43.907 回答
1

我相信设置hbrBackground = GetStockObject(HOLLOW_BRUSH)比设置更正确NULL

关于 Raymond Chen 的 The Old New Thing 的一篇文章做出了区分:

如果您不想自动绘制背景,请通过空心画笔。如果您想要自定义背景绘图,则NULL作为画笔传递。

WNDCLASS的成员的 MSDN 文档hbrBackground说:

当此成员为NULL时,应用程序必须在请求在其客户区绘制时绘制自己的背景。要确定是否必须绘制背景,应用程序可以处理WM_ERASEBKGND消息或测试由函数填充fErase的结构的成员。PAINTSTRUCTBeginPaint

MSDN 文档WM_ERASEBKGND说:

该函数使用结构成员DefWindowProc指定的类背景画笔擦除背景。如果是,应用程序应该处理消息并清除背景。hbrBackgroundWNDCLASShbrBackgroundNULLWM_ERASEBKGND

我的解释是,设置hbrBackground然后NULL忽略处理WM_ERASEBKGND并不意味着严格合法(但可能有效);hbrBackground = NULL是一个承诺,你会处理WM_ERASEBKGND自己,而不是让DefWindowProc尝试使用空指针进行绘制。

于 2016-12-07T23:38:01.983 回答