MFC:如何避免在子控件更新中闪烁?

MFC:如何避免在子控件更新中闪烁?,mfc,controls,flicker,buffering,Mfc,Controls,Flicker,Buffering,我在谷歌上搜索了好几天,得到的都是相同的答案,但不是我想要的(稍后我会描述我不想要的) 我想要的是: 假设我有一个父对话框,其中有几个CStatic子控件 处于焦点时,父对话框使用黑色作为背景,不处于焦点时使用灰色作为背景 子静态控件仅显示文本,但其背景需要跟随父控件的背景色 问题: 我可以让子控件始终跟踪父控件的颜色,但是更新颜色的过程很慢,会导致闪烁 当我使对话框进入焦点时,我可以看到对话框的颜色从灰色变为黑色,然后每个文本控件也从灰色变为黑色 它很慢,因为它在嵌入式设备上 双缓冲不

我在谷歌上搜索了好几天,得到的都是相同的答案,但不是我想要的(稍后我会描述我不想要的)

我想要的是:

  • 假设我有一个父对话框,其中有几个CStatic子控件
  • 处于焦点时,父对话框使用黑色作为背景,不处于焦点时使用灰色作为背景
  • 子静态控件仅显示文本,但其背景需要跟随父控件的背景色
问题:

  • 我可以让子控件始终跟踪父控件的颜色,但是更新颜色的过程很慢,会导致闪烁
  • 当我使对话框进入焦点时,我可以看到对话框的颜色从灰色变为黑色,然后每个文本控件也从灰色变为黑色
  • 它很慢,因为它在嵌入式设备上
双缓冲不起作用,因为父级和子级有自己的绘制例程,所以我认为不可能共享同一个缓冲。我曾读到WS_EX_COMPOSITE或其他东西适用于Vista,但我使用的是低端操作系统

我不需要的:

  • 我已经了解如何覆盖背景擦除例程(这就是为什么我已经让控件更新的原因)
  • 我知道如何使用CMemDC一般,但如上所述,它将不适用于我的情况
有什么想法吗,伙计们?我确信处理速度起到了一定作用,但我坚信这只是一种技术或设置,我做得不对。我记得我的第一台PC是133MHz,但我不记得Windows 95在父母失去焦点时会一个一个地更新控件——它们几乎会立即更新。那时我连一张好的显卡都没有

请帮忙

补充: -我已经尝试使控件的BkMode透明,甚至使用NULL_笔刷。所有这些加上色彩。我得到的只是一个带有孔的对话框,这些孔中有控件文本。换句话说,控件的背景并没有被绘制出来(正如NULL_笔刷所期望的那样),但是该区域也没有被对话框的绘制作业所覆盖。
-我正在考虑删除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
更改对话框的背景色。