我有一个 WIN32 应用程序。它的主窗口是hwndMain
,它的一个子窗口是hwndView
。上有一个选项卡控件hwndTab
。hwndView
当我调整大小时hwndMain
,hwndView
调整大小等hwndTab
。它闪烁一点,但不多。
我曾尝试使用WS_EX_COMPOSITED
样式( for hwndView
or hwndTab
),但它只是给了我空白窗口。我尝试使用WS_EX_TRANSPARENT
它并解决了闪烁问题,但是当窗口大小调整为更大时,子项的更新速度非常慢,例如我看到黑色区域一秒钟,然后该区域被更新。
我已经TreeView
通过使用WS_CHIPCHILDREN
样式成功解决了闪烁问题。(见下文备注)。但是使用WS_CHIPCHILDREN
stlye forhwndView
并不能解决选项卡控件的闪烁问题。
WM_ERASEBKGND
我也关注了Not set hbrBackground
。
我想使用双缓冲区进行选项卡控制,但我找不到用于此目的的教程。我找到的所有教程都是:在WM_PAINT
创建CompatibleDC
和之后,在和......CompatibleBitmap
中画出你想要的东西;memdc
但我不想在WM_PAINT
for中进行任何自定义绘图hwndTab
。我只想让选项卡控件完成这项工作,但只显示最终结果。
有人可以告诉我一个小例子,如何双缓冲选项卡控件(如果您认为这将解决选项卡控件的闪烁问题),语言为c
+ winapi
,因为我不了解 C#、Net 等.
备注:对于我的 TreeView,它是 window 的子级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
,但它只是给出了空白的白色窗口。我真的对这些东西感到困惑。
WS_EX_COMPOSITED
这是我使用时的空白窗口图片hwndView
。我用的时候没有这个问题hwndContainer
。
hwndView
实际上有两个孩子:一个选项卡控件hwndTab
和一个有自己的双缓冲区和绘图的孩子。我不确定这是否会导致使用WS_EX_COMPOSITED
.