我有一个调整大小的对话框。它还有一个自定义背景,我为响应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);
答案 0 :(得分:8)
假设“FillSolidRect”是擦除背景,则从WM_ERASEBKGND返回TRUE。
要执行您在代码片段中几乎要执行的双缓冲,您需要使用CreateCompatibleBitmap并将其选择到您的memDC中。
答案 1 :(得分:6)
尝试将以下行添加到OnInitDialog函数中:
ModifyStyle(0, WS_CLIPCHILDREN, 0);
答案 2 :(得分:5)
在WM_ERASEBKGND处理中不执行任何操作,并将擦除作为主WM_PAINT的一部分。您可以更智能地绘制,以便只重绘无效区域,或者更容易,双重缓冲绘图。
在擦除背景中没有做任何事情,您将所有绘图代码放在一个位置,这样可以让其他人更容易遵循和维护。
答案 3 :(得分:5)
如果您的目标是WinXP或更高版本,您还可以使用WS_EX_COMPOSITED样式默认为具有此样式的顶级窗口启用双缓冲。请记住,这有一些限制 - 具体来说,不再使用GetDC等来绘制OnPaint循环。
答案 4 :(得分:4)
您可以将对InvalidateRect方法的调用参数设置为false。这将阻止您在窗口重绘时发送WM_ERASEBKGND。 Here是防止窗口闪烁的好链接。
答案 5 :(得分:3)
双缓冲确实是使这项工作成功的唯一方法。
只要您确定CLIPCHILDREN
,儿童控件就会自行处理。