我注意到,如果我在具有图像背景的面板中有一个 TabControl,当鼠标悬停在选项卡上时,它会闪烁并重绘。有没有解决方法可以防止这种情况发生?
我看到了。发生这种情况是因为 TabControl 通过要求父控件在其自己的窗口内绘制自身来部分地绘制自身。这是必要的,因为选项卡没有覆盖控件的整个宽度,它们“突出”。如果背景图像绘制速度很慢,您会看到正在绘制的背景和在其上绘制的选项卡之间闪烁。
这将很难修复,TabControl 不支持任何类型的双缓冲。您只能通过提高BackgroundImage 的绘制效率来最小化影响。为此,您需要使图像的大小与面板的 ClientSize 完全相同,这样就不必调整图像的大小。并使用 PixelFormat32bppPArgb 像素格式创建该位图,它通常比其他格式快 10 倍。
有一种神奇的治疗方法,窗口有一个样式标志,可以为整个窗口(包括其子控件)启用双缓冲。自 XP 起就受支持,但已报告了一些副作用。将此代码粘贴到您的表单中,它可以修复 TabControl 闪烁:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
但请注意,TabControl 的视觉样式渲染器与此样式标志有一个相当大的不兼容性。如果您的选项卡溢出并且出现选择箭头,那么它就会变得疯狂并开始一遍又一遍地渲染选项卡,从而产生非常高的闪烁率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)