窗口在响应WM_PAINT消息时会触发WM_ERASEBKGND消息,这个消息时Window用来擦出窗口背景的,如果我们只想改变窗口背景,可以只处理WM_ERASEBKGND消息,在处理函数中对参数接受到的DC填充颜色,而且还可以用CreatePatternBrush创建位图画刷,进而绘制图像背景、
今天绘制一对话框,响应了WM_PAIINT消息,利用双缓冲进行绘制(背景是白色的,边框为黑色),调整窗口大小说出现闪烁,仔细看的话是对话框默认背景色。应该是在WM_PAINT处理之前,系统已经出发了WM_ERASEBKGND消息,而此处没有响应此消息,默认处理就是绘制默认背景色,即对话框背景色。
知道原因就好办了,响应此消息,响应函数里吧窗口接受DC填充为白色,区域为窗口大小,调整窗口大小又会发现黑色边框会闪烁,干脆在WM_ERASEBKGND中什么也不做,仅仅返回TRUE,告诉系统我们已经处理了,不需要默认处理行为。这样显示正常了。
每当我们绘制窗口或控件时,首先要明确是否需要系统的默认背景绘制操作,如果不需要,最好禁止该项操作,否则讨厌的闪烁会不期而遇,哪怕使用栓缓冲绘图、
另外,通过这个例子也可以发现WM_ERASEBKGND处理包含在WM_PAINT处理过程中,所以如果在前者处理过程效率太低,直接影响WM_PAINT的响应。WM_ERASEBKGND处理过程完全可以放在WM_PAINT之中完成,就好比OnPaint调用了OnEraseBkgnd函数,这个调用是系统安排的。