Pau*_*ulH 3 c++ windows wtl flicker
我有一个使用 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
Run Code Online (Sandbox Code Playgroud)
我尝试的解决方案是使CFrameWindowImpl派生类使用该WS_EX_COMPOSITED样式,并且其下面的所有窗口都使用该WS_EX_TRANSPARENT样式。不幸的是,这使得选项卡控件按钮显示为空黑条,并且任何配置视图的控件根本不显示。
如果我删除WS_EX_COMPOSITED和WS_EX_TRANSPARENT样式,表单会正确显示,但CTabView调整大小时,其下面的所有内容都会可怕地闪烁。
我需要更改什么才能消除闪烁并正确绘制控件?
谢谢,保罗
编辑:让它工作。我WS_EX_TRANSPARENT按照马克·兰塞姆的建议删除了所有样式。我只将样式放在(包含在)WS_EX_COMPOSITED上。其他控件根据需要通过 获得双缓冲。CTabCtrlCTabViewWTL::CDoubleBufferImpl<>
窗口会闪烁,因为它在绘制之前就被擦除了。为了消除这个问题,您需要完全禁用窗口擦除并使用双缓冲 - 将窗口内容绘制到位图中,然后将位图复制到窗口。由于位图包含包括背景在内的全部内容,因此无需再擦除。
看起来 WS_EX_COMPOSITED 将自动处理双缓冲,但您可能仍然需要使用 NULL 背景画笔和/或处理 WM_ERASEBKGND 消息。
| 归档时间: |
|
| 查看次数: |
9983 次 |
| 最近记录: |