我有一个WIN32应用程序。它的主窗口是hwndMain
,它的一个孩子是hwndView
。 hwndView
上有一个选项卡控件hwndTab
。选项卡控制闪烁 - WIN32
当我调整hwndMain
时,hwndView
被调整大小,hwndTab
也被调整大小。它闪烁一点,但不多。
我试过使用WS_EX_COMPOSITED
样式(对于hwndView
或hwndTab
),但它只是给了我一个空白的窗口。我尝试使用WS_EX_TRANSPARENT
,它解决了闪烁问题,但是当窗口被调整为较大时,孩子更新非常慢,例如我看到黑色区域一秒钟,然后该区域被更新。
我通过使用WS_CHIPCHILDREN
样式成功地解决了TreeView
的闪烁问题。 (见下面的注释)。但使用WS_CHIPCHILDREN
针对hwndView
的stlye不能解决标签控制的闪烁问题。
我也注意到了WM_ERASEBKGND
和Not set hbrBackground
也。
我想使用双缓冲区的选项卡控制,但我找不到这个目的的教程。我发现的所有教程是:在WM_PAINT
中,创建CompatibleDC
和CompatibleBitmap
后,在memdc
和.....中画出你想要的内容;但我不想在WM_PAINT
中为hwndTab
做任何自定义绘图。我只想离开选项卡控件做这项工作,但只显示最终结果。
有人可以告诉我一个小例子如何加倍缓冲一个选项卡控制(如果你认为这将解决闪烁问题的选项卡控制),在语言c
+ winapi
,因为我没有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
。 当我将它用于hwndContainer
时,没有这样的问题。
hwndView
实际上有两个孩子:一个选项卡控件hwndTab
和一个有自己的双缓冲区和绘图的子项。我不确定这是否会导致使用WS_EX_COMPOSITED
的问题。
不,我没有将WS_EX_COMPOSITED和WS_CLIPCHIDREN结合起来。我第一次尝试(对于hwndView)'WS_EX_COMPOSITED',但它给了我白色的空白窗口。然后我在第三个参数中尝试了'WS_CLIPCHILDREN',即'WS_CHILD | WS_CLIPCHILDREN',没有问题,但没有解决闪烁问题。 – user565739 2012-08-06 07:31:07
但是随着你的解释,我知道为什么它在TreeView中起作用,当我把'WS_CLIPCHILDREN'放在第一个参数中。 – user565739 2012-08-06 07:33:33
我编辑了我的问题,最后提供了更多信息。 – user565739 2012-08-06 07:42:41