我有一个调整大小的对话框.它还有一个自定义背景,我为响应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);
David L Morr.. 8
假设"FillSolidRect"是擦除背景,则从WM_ERASEBKGND返回TRUE.
要执行您在代码片段中几乎要执行的双缓冲,您需要使用CreateCompatibleBitmap并将其选择到您的memDC中.
假设"FillSolidRect"是擦除背景,则从WM_ERASEBKGND返回TRUE.
要执行您在代码片段中几乎要执行的双缓冲,您需要使用CreateCompatibleBitmap并将其选择到您的memDC中.
尝试将以下行添加到OnInitDialog函数:
ModifyStyle(0, WS_CLIPCHILDREN, 0);
在WM_ERASEBKGND处理中不执行任何操作,并将擦除作为主WM_PAINT的一部分.您可以更智能地绘制,以便只重绘无效区域,或者更容易,双重缓冲绘图.
通过在擦除背景中不做任何事情,您将所有绘图代码放在一个位置,这样可以使其他人更容易遵循和维护.
如果您的目标是WinXP或更高版本,则还可以使用WS_EX_COMPOSITED样式默认为具有此样式的顶级窗口启用双缓冲.请记住,这有一些限制 - 具体来说,不再使用GetDC等来绘制OnPaint循环.