窗口背景是在窗口开始绘制之前用于填充工作区的颜色或图案。 窗口背景覆盖在窗口移动到该处之前屏幕上的任何内容,擦除现有图像,并防止应用程序的新输出与不相关的信息混合。
系统绘制窗口的背景,或者在应用程序调用
BeginPaint
时,通过向其发送
WM_ERASEBKGND
消息来为窗口提供执行此操作的机会。 如果应用程序不处理消息,而是将其传递给
DefWindowProc
,系统会通过在窗口的 类指定的背景画笔中填充模式来擦除背景。 如果画笔无效或类没有背景画笔,系统会在
BeginPaint
返回的
PAINTSTRUCT
结构中设置
fErase
成员,但不执行任何其他操作。 然后,如有必要,应用程序有第二次机会绘制窗口背景。
如果处理
WM_ERASEBKGND
,应用程序应使用消息的
wParam
参数绘制背景。 此参数包含窗口的显示设备上下文的句柄。 绘制背景后,应用程序应返回非零值。 这可确保
BeginPaint
不会错误地将
PAINTSTRUCT
结构的
fErase
成员设置为非零值, (指示在应用程序处理后续WM_PAINT消息时应擦除
背景
) 。
使用 RegisterClass 函数注册类时,应用程序可以通过向
WNDCLASS
结构的
hbrBackground
成员分配画笔句柄或系统颜色值来定义类背景
画笔
。
GetStockObject
或
CreateSolidBrush
函数可用于创建画笔句柄。 系统颜色值可以是为
SetSysColors
函数定义的值之一。 (必须先增加一个值,然后才能将其分配给 member.)
即使定义了类背景画笔,应用程序也可以处理
WM_ERASEBKGND
消息。 这在允许用户更改指定窗口的窗口背景色或图案而不影响 类中的其他窗口的应用程序中很常见。 在这种情况下,应用程序不得将消息传递到
DefWindowProc
。
应用程序不需要对齐画笔,因为系统使用窗口原点作为参照点绘制画笔。 鉴于此,用户可以移动窗口,而不会影响图案画笔的对齐方式。