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

标签 mfc controls flicker buffering

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

我想要的是:

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

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

  • 双缓冲不起作用,因为 parent 和 child 有自己的绘画程序,所以我认为不可能共享同一个缓冲区。我读过 WS_EX_COMPOSITE 或适用于 Vista 的东西,但我使用的是低端操作系统。

    我不需要的:
  • 我已经了解如何覆盖后台删除例程(这就是我已经更新控件的原因)
  • 我一般都知道如何使用 CMemDC,但如前所述,它不适用于我的情况。

  • 有什么想法吗,伙计们?我确信处理速度起到了一定的作用,但我坚信这只是一种技术或设置,我做得不对。我记得我的第一台 PC 是 133MHz,但我不记得 Windows 95 在其父级失去焦点时逐个更新控件——它们几乎立即更新。那时我什至没有好的视频卡。

    请帮忙。

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

    最佳答案

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

    关于MFC:如何避免子控件更新闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714034/

    相关文章:

    c++ - CComboBox排序

    nunit - Cruise Control.NET、NUnit 集成

    c++ - 获取 CWnd 内具有焦点的 Controller

    c++ - 如何在 MFC 中调试不断失去焦点的窗口(例如对话框)?

    c# - 如何在 toolstripbutton 上使用工具提示

    c# - 如何在窗体上加倍缓冲 .NET 控件?

    javascript - 滚动条上闪烁的侧边栏

    google-maps-api-3 - 放大 Google Map Api 时会出现恼人的白色闪烁

    c++ - 在 VIsual Studio 错误 NewFolder 中运行 MFC C++ 代码不是有效的工作目录

    C# winform 检查控件是否物理可见