我有一个WIN32应用程序。它的主窗口是hwndMain
,其中一个孩子是hwndView
。 hwndTab
上有一个标签控件hwndView
。
当我调整hwndMain
的大小时,hwndView
会调整大小,hwndTab
也会调整大小。它闪烁了一点,但并不多。
我尝试使用WS_EX_COMPOSITED
样式(hwndView
或hwndTab
),但它只给了我一个空白窗口。我尝试使用WS_EX_TRANSPARENT
并且它解决了闪烁问题,但是当窗口调整为更大时,子项更新速度非常慢,例如我看到黑色区域一秒钟,然后更新区域。
我已成功使用TreeView
样式解决了WS_CHIPCHILDREN
的闪烁问题。 (见下面的评论)。但是对WS_CHIPCHILDREN
使用hwndView
stlye并不能解决标签控件的闪烁问题。
我也关注WM_ERASEBKGND
和Not set hbrBackground
。
我想使用双缓冲区进行选项卡控制,但我找不到用于此目的的教程。我找到的所有教程都是:在WM_PAINT
中,在创建CompatibleDC
和CompatibleBitmap
之后,在memdc
和.....中绘制您想要的内容;但我不想在WM_PAINT
hwndTab
中进行任何自定义绘图。我只是想让tab控件完成这项工作,但只显示最终结果。
有人可以用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
实际上有两个子节点:一个制表符控件hwndTab
和一个具有自己的双缓冲区和绘图的子节点。我不确定这是否会导致使用WS_EX_COMPOSITED
的问题。
答案 0 :(得分:1)
您使用WS_EX_COMPOSITED
样式 。当您将WS_CLIPCHIDREN
作为第一个参数传递给CreateWindowEx
时,它会将WS_CLIPCHILDREN
的值解释为扩展窗口样式。由于WS_CLIPCHILDREN
的值为0x02000000L
,与WS_EX_COMPOSITED
相同,因此您刚刚创建了一个合成窗口。
根据文档,合成窗口的所有后代都使用双缓冲以自下而上的绘画顺序绘制。
当你说:
时,我不确定你的意思我尝试使用WS_EX_COMPOSITED样式(对于hwndView或hwndTab),但它只是给了我一个空白窗口。
您必须发布代码才能重现此问题。但是,您的倒数第二个代码段 会生成一个合成窗口。