我有一个 WIN32 应用程序。它的主窗口是hwndMain
,它的子窗口之一是hwndView
。 hwndView
上有一个选项卡控件 hwndTab
。
当我调整 hwndMain
大小时,hwndView
会调整大小,hwndTab
也会调整大小。它有点闪烁,但不多。
我尝试使用WS_EX_COMPOSITED
样式(对于hwndView
或hwndTab
),但它只是给了我空白窗口。我尝试使用 WS_EX_TRANSPARENT ,它解决了闪烁问题,但是当窗口大小调整到更大时,子级更新非常慢,例如我看到黑色区域一秒钟,然后该区域被更新。
我已经通过使用WS_CHIPCHILDREN
样式成功解决了TreeView
的闪烁问题。 (见下面的注释)。但对 hwndView
使用 WS_CHIPCHILDREN
STLye 并不能解决选项卡控件的闪烁问题。
我也注意到了WM_ERASEBKGND
和Not set hbrBackground
。
我想使用双缓冲区进行选项卡控制,但我找不到用于此目的的教程。我找到的所有教程都是:在WM_PAINT
中,创建CompatibleDC
和CompatibleBitmap
后,在memdc
中绘制你想要的内容和.....;但我不想在 WM_PAINT
中为 hwndTab
进行任何自定义绘图。我只想让选项卡控件完成这项工作,但只显示最终结果。
有人可以向我展示一个小示例,如何使用 c
+ winapi
c 语言对选项卡控件进行双缓冲(如果您认为这将解决选项卡控件的闪烁问题) code>,因为我没有 C#、Net 等知识。
备注:对于我的 TreeView,它是窗口 hwndContainer
的子窗口。它的创建方式为:
win->hwndContainer = CreateWindowEx(
WS_CLIPCHILDREN,
_T("SUMATRA_PDF_TOCBOX"), NULL,
WS_CHILD,
0, 0, gGlobalPrefs.sidebarDx, 0,
win->hwndPanel, NULL,
ghinst, NULL);
使用WS_CLIPCHILDREN
修复闪烁,即使我不使用双缓冲区。但奇怪的是
WS_CLIPCHILDREN
在第一个参数位置。如果我把它放在 WS_CHILD 之后,即
win->hwndContainer = CreateWindowEx(
NULL,
_T("SUMATRA_PDF_TOCBOX"), NULL,
WS_CHILD | WS_CLIPCHILDREN,
0, 0, gGlobalPrefs.sidebarDx, 0,
win->hwndPanel, NULL,
ghinst, NULL);
,然后仍然出现闪烁。
所以我在创建hwndView
时也尝试使用第一种方式,但它只是给出了空白的白色窗口。
我真的对这些东西感到困惑。
这是我对 hwndView
使用 WS_EX_COMPOSITED
时的空白窗口图片。
我用hwndContainer
时没有这个问题。
hwndView
实际上有两个子项:一个选项卡控件 hwndTab
和一个拥有自己的双缓冲区和绘图的子项。我不确定这是否会导致使用 WS_EX_COMPOSITED
出现问题。
最佳答案
您正在使用WS_EX_COMPOSITED
样式。当您将 WS_CLIPCHILDREN
作为第一个参数传递给 CreateWindowEx
时,它会将 WS_CLIPCHILDREN
的值解释为扩展窗口风格。由于 WS_CLIPCHILDREN
的值为 0x02000000L
,与 WS_EX_COMPOSITED
相同,因此您刚刚创建了一个复合窗口。
根据文档,复合窗口的所有后代都使用双缓冲按照从下到上的绘制顺序进行绘制。
我不确定你说的是什么意思:
I have tried to use WS_EX_COMPOSITED style ( for hwndView or hwndTab), but it just gave me blank window.
您必须发布重现此问题的代码。但是您的倒数第二个代码片段正在生成一个合成窗口。
关于c - 选项卡控件上的闪烁 - WIN32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11823131/