我有一个WIN32应用程序。它的主窗口是hwndMain,其子窗口之一是hwndViewhwndTab上有一个选项卡控件hwndView

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

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

我已经通过使用TreeView样式成功解决了WS_CHIPCHILDREN的闪烁问题。 (请参阅下面的备注)。但是将WS_CHIPCHILDREN stlye用于hwndView不能解决选项卡控件的闪烁问题。

我也注意了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时,我也尝试使用第一种方法,但它只是空白的窗口。
这些东西我真的很困惑。

这是当我将WS_EX_COMPOSITED用作hwndView时的空白窗口图片。
当我将其用于hwndContainer时,没有这样的问题。

实际上,hwndView有两个子项:一个Tab控件hwndTab和一个具有自己的双缓冲区和图形的子项。我不确定这是否会导致使用WS_EX_COMPOSITED的问题。

最佳答案

您正在使用WS_EX_COMPOSITED样式。当将WS_CLIPCHIDREN作为第一个参数传递给CreateWindowEx时,它会将WS_CLIPCHILDREN的值解释为扩展窗口样式。由于WS_CLIPCHILDREN的值是0x02000000L,与WS_EX_COMPOSITED相同,因此您刚刚创建了一个复合窗口。

根据该文档,复合窗口的所有后代均使用双缓冲从下到上的绘画顺序进行绘画。

我不确定您说的是什么意思:


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


您必须发布代码来重现此问题。但是倒数第二个代码段正在生成一个复合窗口。

08-18 03:48