2012-08-06 122 views
0

我有一个WIN32应用程序。它的主窗口是hwndMain,它的一个孩子是hwndViewhwndView上有一个选项卡控件hwndTab选项卡控制闪烁 - WIN32

当我调整hwndMain时,hwndView被调整大小,hwndTab也被调整大小。它闪烁一点,但不多。

我试过使用WS_EX_COMPOSITED样式(对于hwndViewhwndTab),但它只是给了我一个空白的窗口。我尝试使用WS_EX_TRANSPARENT,它解决了闪烁问题,但是当窗口被调整为较大时,孩子更新非常慢,例如我看到黑色区域一秒钟,然后该区域被更新。

我通过使用WS_CHIPCHILDREN样式成功地解决了TreeView的闪烁问题。 (见下面的注释)。但使用WS_CHIPCHILDREN针对hwndView的stlye不能解决标签控制的闪烁问题。

我也注意到了WM_ERASEBKGNDNot set hbrBackground也。

我想使用双缓冲区的选项卡控制,但我找不到这个目的的教程。我发现的所有教程是:在WM_PAINT中,创建CompatibleDCCompatibleBitmap后,在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的问题。

enter image description here

回答

1

使用WS_EX_COMPOSITED风格。当您通过WS_CLIPCHIDREN作为CreateWindowEx的第一个参数时,它会将WS_CLIPCHILDREN的值解释为扩展的窗口样式。由于WS_CLIPCHILDREN的值为0x02000000L,与WS_EX_COMPOSITED相同,因此您刚刚创建了一个合成窗口。

根据文档,一个合成窗口的所有后代都使用双缓冲按照从下到上的绘画顺序进行绘制。

我不知道你是什么意思时,你说:

我曾尝试使用WS_EX_COMPOSITED样式(hwndView或hwndTab),但它只是给了我空白窗口。

您将不得不张贴代码重现此问题。但是倒数第二个代码段产生一个合成窗口。

+0

不,我没有将WS_EX_COMPOSITED和WS_CLIPCHIDREN结合起来。我第一次尝试(对于hwndView)'WS_EX_COMPOSITED',但它给了我白色的空白窗口。然后我在第三个参数中尝试了'WS_CLIPCHILDREN',即'WS_CHILD | WS_CLIPCHILDREN',没有问题,但没有解决闪烁问题。 – user565739 2012-08-06 07:31:07

+0

但是随着你的解释,我知道为什么它在TreeView中起作用,当我把'WS_CLIPCHILDREN'放在第一个参数中。 – user565739 2012-08-06 07:33:33

+0

我编辑了我的问题,最后提供了更多信息。 – user565739 2012-08-06 07:42:41