c - 选项卡控件上的闪烁 - WIN32

标签 c winapi tabs flicker double-buffering

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

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

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

我已经通过使用WS_CHIPCHILDREN样式成功解决了TreeView的闪烁问题。 (见下面的注释)。但对 hwndView 使用 WS_CHIPCHILDREN STLye 并不能解决选项卡控件的闪烁问题。

我也注意到了WM_ERASEBKGNDNot set hbrBackground

我想使用双缓冲区进行选项卡控制,但我找不到用于此目的的教程。我找到的所有教程都是:在WM_PAINT中,创建CompatibleDCCompatibleBitmap后,在memdc中绘制你想要的内容和.....;但我不想在 WM_PAINT 中为 hwndTab 进行任何自定义绘图。我只想让选项卡控件完成这项工作,但只显示最终结果。

有人可以向我展示一个小示例,如何使用 c + winapic 语言对选项卡控件进行双缓冲(如果您认为这将解决选项卡控件的闪烁问题) code>,因为我没有 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 使用 WS_EX_COMPOSITED 时的空白窗口图片。 我用hwndContainer时没有这个问题。

hwndView 实际上有两个子项:一个选项卡控件 hwndTab 和一个拥有自己的双缓冲区和绘图的子项。我不确定这是否会导致使用 WS_EX_COMPOSITED 出现问题。

enter image description here

最佳答案

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

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

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

I have tried to use WS_EX_COMPOSITED style ( for hwndView or hwndTab), but it just gave me blank window.

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

关于c - 选项卡控件上的闪烁 - WIN32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11823131/

相关文章:

c - _int_malloc 导致段错误的 malloc

创建两个以上的 StatusBar 部件

c++ - C++ 控制台应用程序中的 mp3 文件的 MCI_OPEN 失败

http - Win32 : What is the status of chunked encoding support in WinHttpReadData?

android - 是否可以以编程方式更改操作栏选项卡指示器

c - 测量进程的生命周期(因为它被加载到内存中)

c - 我是 C 新手。第二个 for 循环永远不会结束为什么会这样

c - C语言中的内存管理错误。为什么会出现这些错误?

JavaScript Feed - 在新选项卡中打开链接

javascript - Vue 表单向导 : Make the tab index dynamic by the route