0

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

当我调整大小时hwndMainhwndView调整大小等hwndTab。它闪烁一点,但不多。

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

我已经TreeView通过使用WS_CHIPCHILDREN样式成功解决了闪烁问题。(见下文备注)。但是使用WS_CHIPCHILDRENstlye forhwndView并不能解决选项卡控件的闪烁问题。

WM_ERASEBKGND我也关注了Not set hbrBackground

我想使用双缓冲区进行选项卡控制,但我找不到用于此目的的教程。我找到的所有教程都是:在WM_PAINT创建CompatibleDC和之后,在和......CompatibleBitmap中画出你想要的东西;memdc但我不想在WM_PAINTfor中进行任何自定义绘图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.

在此处输入图像描述

4

1 回答 1

1

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

根据文档,复合窗口使用双缓冲以自下而上的绘制顺序绘制其所有后代。

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

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

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

于 2012-08-06T06:39:37.293 回答