c++ - 带有 WS_EX_COMPOSITED 的无闪烁选项卡控件

标签 c++ windows flicker wtl

我有一个使用 WTL 8.1 开发的适用于 Windows XP SP3 的 VS2008 C++ 应用程序。我的应用程序包含一个选项卡控件,它会在调整应用程序边框大小时闪烁。

我的窗口层次结构如下所示:

CFrameWindowImpl   CMainFrm
|-CSplitterWindow  Splitter
  |-CTabView       Configuration Tabs
  | |-CDialogImpl  Configuration View 1
  | |-CDialogImpl  Configuration View 2
  | |-CDialogImpl  Configuration View 3
  |-CDialogImpl    Control View

我正在尝试的解决方案是制作 CFrameWindowImpl派生类使用 WS_EX_COMPOSITED样式及其下方的所有窗口都使用 WS_EX_TRANSPARENT风格。不幸的是,这会使选项卡控件按钮显示为空的黑条,并且任何配置 View 的控件根本不会显示。

如果我删除 WS_EX_COMPOSITEDWS_EX_TRANSPARENT样式,表单显示正确,但 CTabView调整大小时,它下面的所有内容都会可怕地闪烁。

我需要更改什么才能消除闪烁并正确绘制控件?

谢谢, 保罗H


编辑: 得到它的工作。我删除了所有 WS_EX_TRANSPARENT根据 Mark Ransom 的建议样式。我把 WS_EX_COMPOSITED CTabCtrl 上的样式(包含在 CTabView 中)。其他控件根据需要通过 WTL::CDoubleBufferImpl<> 获得双缓冲.

最佳答案

窗口闪烁是因为它在绘制之前被删除。要消除这种情况,您需要完全禁用窗口删除并使用双缓冲 - 将窗口内容绘制到位图中,然后将位图复制到窗口中。因为位图包含了包括背景在内的全部内容,所以不再需要删除。

看起来 WS_EX_COMPOSITED 会自动处理双缓冲,但您仍然可能需要使用 NULL 背景画笔和/或处理 WM_ERASEBKGND 消息。

关于c++ - 带有 WS_EX_COMPOSITED 的无闪烁选项卡控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188306/

相关文章:

windows - 为什么 Visual Studio Build Tools 安装程序会立即返回而不安装任何东西?

javascript - 从 OpenProcessing 下载时,Processing.js 草图闪烁

c++ - 从 Maya C++ API 中的变换节点获取网格节点

c++ - 表达式必须有一个常量值

windows - 用于检查 Windows 服务是否正在运行以及是否不启动该服务的脚本。 Windows 2000

windows - 如何解释批处理字符串中的变量?

css - IE8下有些图片闪烁

wxPython listctrl 快速更新闪烁

c++ - 简单地调用 Pitch() 和 Yaw() 怎么会导致相机最终 Roll()?

c++ - qt - 如何通过 http 下载和保存图像?