我有一个WIN32应用程序。它的主窗口是hwndMain
,其子窗口之一是hwndView
。 hwndTab
上有一个选项卡控件hwndView
。
当我调整hwndMain
的大小时,hwndView
也会被调整大小,hwndTab
也会被调整大小。它闪烁了一点,但不多。
我尝试使用WS_EX_COMPOSITED
样式(对于hwndView
或hwndTab
),但这只是给我空白窗口。我尝试使用WS_EX_TRANSPARENT
并解决了闪烁问题,但是当将窗口调整为更大的大小时,子项的更新速度非常慢,例如,我看到黑色区域一秒钟,然后更新了该区域。
我已经通过使用TreeView
样式成功解决了WS_CHIPCHILDREN
的闪烁问题。 (请参阅下面的备注)。但是将WS_CHIPCHILDREN
stlye用于hwndView
不能解决选项卡控件的闪烁问题。
我也注意了WM_ERASEBKGND
和Not set hbrBackground
。
我想使用双缓冲区进行制表符控制,但是找不到用于此目的的教程。我发现的所有教程都是:在WM_PAINT
中,在创建CompatibleDC
和CompatibleBitmap
之后,在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),但是它给了我空白的窗口。
您必须发布代码来重现此问题。但是倒数第二个代码段正在生成一个复合窗口。