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

调整对话框大小后,会出现巨大的闪烁现象。为了尝试减少闪烁,我枚举所有子窗口并将它们添加到剪切区域。这似乎有点帮助 - 现在,当他们重新粉刷时,所有儿童控件中的闪烁都很明显。

如何在调整大小时使对话框无闪烁?我怀疑双缓冲必须发挥作用,但我不确定如何使用带有子控件的对话框(没有让所有子控件拥有者绘制或类似的东西)。

我应该注意到我使用的是C ++(不是.NET)和MFC,尽管欢迎基于Win32的纯解决方案:)

注意:我尝试但有些不起作用(不确定原因)是:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
有帮助吗?

解决方案

假设“FillSolidRect”是擦除你的背景然后从WM_ERASEBKGND返回TRUE。

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

其他提示

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

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

在WM_ERASEBKGND处理中不执行任何操作,并将擦除作为主WM_PAINT的一部分。您可以更智能地绘制,以便只重绘无效区域,或者更容易,双重缓冲绘图。

在擦除背景中没有做任何事情,您将所有绘图代码放在一个位置,这样可以让其他人更容易遵循和维护。

如果您的目标是WinXP或更高版本,您还可以使用WS_EX_COMPOSITED样式默认为具有此样式的顶级窗口启用双缓冲。请记住,这有一些限制 - 具体来说,不再使用GetDC等来绘制OnPaint循环。

您可以将对InvalidateRect方法的调用参数设置为false。这将阻止您在窗口重绘时发送WM_ERASEBKGND。 这里是防止窗口闪烁的好链接。

双缓冲确实是使这项工作成功的唯一方法。

只要您确定 CLIPCHILDREN ,子控件就会自行处理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top