MFC:如何避免儿童控制更新中的闪烁?

时间:2011-10-10 14:10:58

标签: mfc controls flicker buffering

我一直在谷歌上搜索,我得到的只是相同的答案,但不是我想要的(我会描述我以后不想要的)。

我想要的是:

  • 假设我有一个父对话框,其中包含一些CStatic子控件。
  • 父对话框在焦点时使用黑色作为背景,在不在焦点时使用灰色。
  • 子静态控件只显示文本,但其背景需要遵循父级的背景颜色

问题:

  • 我可以让子控件始终跟踪父级的颜色,但更新颜色的过程很慢并导致闪烁。
  • 当我让对话框进入焦点时,我可以看到对话框的颜色从灰色变为黑色,然后每个文本控制也从灰色变为黑色。
  • 它很慢,因为它在嵌入式设备上。

双缓冲不起作用,因为父和子拥有它自己的绘图例程,所以我认为共享相同的缓冲区是不可能的。我已经读过WS_EX_COMPOSITE或适用于Vista的东西,但我是在低端操作系统上。

我不需要的内容:

  • 我已经了解如何覆盖后台擦除例程(这就是为什么我已经让控件更新)
  • 我一般都知道如何使用CMemDC,但如上所述,它对我的​​情况不起作用。

任何想法,伙计们?我确信处理速度是其中的一部分,但我坚信这只是一种技巧或设置,我做得不对。我记得我的第一台PC是133MHz,但我不记得Windows 95在父母失去焦点的情况下逐个更新控件 - 他们几乎立即更新。那时我甚至没有一张好的视频卡。

请帮忙。

加法: - 我尝试将控件的BkMode设置为TRANSPARENT,甚至使用NULL_BRUSH。所有这些与ON_WM_CTLCOLOR一起。我得到的只是一个带孔的对话框,在那些洞中是控制文本。换句话说,不是绘制控件的背景而是绘制(如NULL_BRUSH所预期的那样),但对话框的绘制作业也没有覆盖该区域。 - 我正在考虑删除WS_CLIPCHILDREN,但我相信无论如何都会导致控件被覆盖,所以,再次闪烁。

3 个答案:

答案 0 :(得分:1)

你尝试过SetRedraw()吗?您可以为子窗口调用SetRedraw(FALSE),这样每次更改父级时它们都不会自动更新,当父编辑完成后,您最终可以为子级调用SetRedraw(TRUE) - 并且可能在此时无效以便它们自行更新只有一次。

答案 1 :(得分:0)

您是否尝试覆盖WM_CTLCOLOR?查看my answer to this post

注意:您可以使用pDC->SetBkColor设置静态控件的背景颜色,并返回所需颜色的画笔。

答案 2 :(得分:0)

我之前通过覆盖对话框的擦除背景来完成此操作。然后,不是调用默认函数,而是准备区域,遍历对话框的所有子项并从区域中剪切出它们的边界。最后,使用对话框背景颜色填充矩形。

基本上,这个想法只是在没有控件的地方擦除。

这会,但我不确定是否有更好的方法来做到这一点。就像'剪辑儿童'选项一样,或者我相信有双重缓冲的风格。