MFC:如何避免在子控件更新中闪烁?
我在谷歌上搜索了好几天,得到的都是相同的答案,但不是我想要的(稍后我会描述我不想要的) 我想要的是:MFC:如何避免在子控件更新中闪烁?,mfc,controls,flicker,buffering,Mfc,Controls,Flicker,Buffering,我在谷歌上搜索了好几天,得到的都是相同的答案,但不是我想要的(稍后我会描述我不想要的) 我想要的是: 假设我有一个父对话框,其中有几个CStatic子控件 处于焦点时,父对话框使用黑色作为背景,不处于焦点时使用灰色作为背景 子静态控件仅显示文本,但其背景需要跟随父控件的背景色 问题: 我可以让子控件始终跟踪父控件的颜色,但是更新颜色的过程很慢,会导致闪烁 当我使对话框进入焦点时,我可以看到对话框的颜色从灰色变为黑色,然后每个文本控件也从灰色变为黑色 它很慢,因为它在嵌入式设备上 双缓冲不
- 假设我有一个父对话框,其中有几个CStatic子控件李>
- 处于焦点时,父对话框使用黑色作为背景,不处于焦点时使用灰色作为背景
- 子静态控件仅显示文本,但其背景需要跟随父控件的背景色
- 我可以让子控件始终跟踪父控件的颜色,但是更新颜色的过程很慢,会导致闪烁
- 当我使对话框进入焦点时,我可以看到对话框的颜色从灰色变为黑色,然后每个文本控件也从灰色变为黑色
- 它很慢,因为它在嵌入式设备上
- 我已经了解如何覆盖背景擦除例程(这就是为什么我已经让控件更新的原因)
- 我知道如何使用CMemDC一般,但如上所述,它将不适用于我的情况
-我正在考虑删除WS_CLIPCHILDREN,但我相信这会导致控件被绘制,因此,再次闪烁。您是否尝试覆盖
WM_CTLCOLOR
?退房
注意:您可以使用
pDC->SetBkColor
设置静态控件的背景色,并返回具有所需颜色的画笔。是否尝试过SetRedraw()?您可以为子窗口调用SetRedraw(FALSE),这样子窗口就不会在每次更改父窗口时更新自己,当父窗口编辑完成后,您最终可以调用SetRedraw(TRUE)对于儿童-可能会在那个时候失效,所以他们只更新自己一次。我以前通过覆盖对话框的擦除背景做过这件事。然后,不调用默认函数,而是准备区域,遍历对话框的所有子对象,并从区域中裁剪出它们的边界。最后,用对话框背景色填充矩形
基本上,这个想法是只在没有控件的地方擦除
这可能会,但我不确定是否有更好的方法。比如“clip children”选项,或者我相信有双缓冲的风格。我对MFC一无所知,所以如果这不是一个相关的问题,请原谅,但是不可能只将子控件设置为透明背景吗?啊,是的,我也想到了这一点。我将更新我的初始帖子,以反映我在使用它时遇到的问题。您使用的是哪个版本的MFC和Visual Studio?基本上,我不会在必要时让控件更新其背景色。问题在于导致闪烁的更新(父->子1->子2->等)的速度和顺序。我有一个解决方案,就是简单地覆盖对话框的OnPaint,并使用DrawText。它完美地使用透明模式,但我想要一个解决方案,涵盖子控件的使用。我不可能每次都画所有的东西。。。那就不用用MFC了。嗨,杰多特。是的,我用了所有这些,它可以改变背景颜色。但问题是如何避免闪烁,而不是如何改变颜色。在我的平台上,“先更新家长,然后再更新个别孩子”的过程太慢了。
WM_CTLCOLOR
的想法是避免使用WM_PAINT
或WM_ERASEBKGND
,这可能会导致闪烁。您应该知道,您还可以使用WM\u CTLCOLOR
更改对话框的背景色。