当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《如何在Windows对话框中处理WM_ERASEBKGND时避免闪烁》经验,为你挑选了4个好方法。

我有一个调整大小的对话框.它还有一个自定义背景,我为响应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中.



1> David L Morr..:

假设"FillSolidRect"是擦除背景,则从WM_ERASEBKGND返回TRUE.

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



2> Adam Pierce..:

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

    ModifyStyle(0, WS_CLIPCHILDREN, 0);



3> Jeff Yates..:

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

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



4> adzm..:

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有