如何在Windows对话框中处理WM_ERASEBKGND时避免闪烁

如何在Windows对话框中处理WM_ERASEBKGND时避免闪烁,windows,dialog,resize,gdi,flicker,Windows,Dialog,Resize,Gdi,Flicker,我有一个可以调整大小的对话框。它还有一个自定义的背景,我为响应WM_ERASEBKGND调用(目前是对FillSolidRect的一个简单调用)而绘制 当对话框调整大小时,会出现巨大的闪烁。为了尝试减少闪烁,我列举了所有子窗口,并将它们添加到剪辑区域。这似乎有点帮助——现在,在所有子控件重新绘制时,闪烁现象最为明显 如何使对话框在调整大小时不闪烁?我怀疑双缓冲一定起了一定作用,但我不确定如何使用带有子控件的对话框来实现这一点(而不是让所有子控件都是所有者绘制的或类似的东西) 我应该注意到,我使用

我有一个可以调整大小的对话框。它还有一个自定义的背景,我为响应WM_ERASEBKGND调用(目前是对FillSolidRect的一个简单调用)而绘制

当对话框调整大小时,会出现巨大的闪烁。为了尝试减少闪烁,我列举了所有子窗口,并将它们添加到剪辑区域。这似乎有点帮助——现在,在所有子控件重新绘制时,闪烁现象最为明显

如何使对话框在调整大小时不闪烁?我怀疑双缓冲一定起了一定作用,但我不确定如何使用带有子控件的对话框来实现这一点(而不是让所有子控件都是所有者绘制的或类似的东西)

我应该注意到,我使用C++(不.NET)和MFC,虽然欢迎基于纯Win32的解决方案: 注意:有一件事我试过了,但没有成功(不知道为什么):


双缓冲确实是实现这一点的唯一方法


只要您确保
CLIPCHILDREN

在WM_擦除Gnd处理中不执行任何操作,并将擦除作为主要WM_绘制的一部分,子控件将自行处理。可以更智能地绘制,以便只重新绘制无效区域,也可以更轻松地对图形进行双重缓冲


通过不在擦除背景中执行任何操作,您将所有图形代码放在一个位置,这将使其他人更易于遵循和维护。

尝试将以下行添加到OnInitDialog函数中:

    ModifyStyle(0, WS_CLIPCHILDREN, 0);
假设“FillSolidRect”是背景的擦除,然后从WM_ERASEBKGND返回TRUE


要在代码片段中执行几乎要执行的双缓冲,您需要使用CreateCompatibleBitmap并将其选择到memDC中。

如果您的目标是WinXP或更高版本,您还可以使用WS_EX_COMPOSITED样式,默认情况下为具有此样式的顶级窗口启用双缓冲。请记住,这有其自身的一组限制——特别是,不再使用GetDC从OnPaint循环中提取,等等。

您可以将调用InvalidateBu立方法的参数设置为false。这将阻止您在窗口重新绘制时发送WM_ERASEBKGND。

您的链接似乎已断开
    ModifyStyle(0, WS_CLIPCHILDREN, 0);