2011-10-10 182 views
3

我一直在Google上搜索几天,我所得到的只是相同的答案,但不是我想要的(我将描述我以后不想要的东西)。MFC:如何避免在子控件更新中闪烁?

我要的是:

  • 说我有了一些静态控件的子控件父对话框。
  • 父对话框在对焦时使用黑色作为背景,而在未对焦时使用灰色。
  • 孩子静态控件只显示文本,但它的背景需要遵循父母的背景色

问题:

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

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

我不需要什么:

  • 我已经知道如何重写背景擦除程序(这就是为什么我已经得到控制,以更新)
  • 我知道如何普遍使用CMemDC类,但正如所述,它不适用于我的情况。

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

请帮忙。

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

+0

我不知道任何关于MFC的,所以请问如果这不是一个相关的问题,但它是不可能的只是设置子控件有一个透明的背景? –

+0

啊,是的,我也想到了这一点。我会更新我的初始文章,以反映我曾经遇到的问题。 – Ryuu

+0

您使用的是哪个版本的MFC和Visual Studio? – ChrisBD

回答

0

您是否试图覆盖WM_CTLCOLOR?检出my answer to this post

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

+0

嗨djeidot。是的,我使用了所有这些,并且它可以改变背景颜色。但问题是如何避免闪烁,而不是如何改变颜色。 “父母更新第一,然后个别孩子以后更新”的过程在我的平台上太慢了。 – Ryuu

+0

“WM_CTLCOLOR”的想法是避免使用可能导致闪烁的“WM_PAINT”或“WM_ERASEBKGND”。你应该知道你也可以用'WM_CTLCOLOR'来改变对话框的背景颜色。 – djeidot

1

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

0

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

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

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