jwa*_*ech 3 tabcontrol winforms
我注意到如果我在一个具有图像背景的面板中有一个TabControl,当鼠标悬停在一个标签上时,它会闪烁并重绘.是否有解决方法来防止这种情况发生?
Han*_*ant 10
我看到了.之所以发生这种情况,是因为TabControl通过要求父控件在自己的窗口中绘制自己来部分绘制自己.必要的是因为标签没有覆盖控件的整个宽度,所以它们"伸出".如果BackgroundImage的绘制速度很慢,您将看到正在绘制的背景和在其上绘制的选项卡之间的闪烁.
这很难解决,TabControl不支持任何类型的双缓冲.您只能通过使BackgroundImage高效绘制来最小化效果.您需要通过使图像与面板的ClientSize大小完全相同来实现,这样就不必调整图像大小.并使用PixelFormat32bppPArgb像素格式创建该位图,它通常比其他格式快10倍.
有一种神奇的治疗方法,Windows有一个样式标志,可以为整个窗口提供双缓冲,包括它的子控件.从XP开始支持,但已报告了一些副作用.将此代码粘贴到表单中,它修复了TabControl闪烁:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Run Code Online (Sandbox Code Playgroud)
但请注意,TabControl的视觉样式渲染器与此样式标志有一个相当大的不兼容性.如果您的标签溢出并且您获得了选择箭头,那么它会变成香蕉并开始一遍又一遍地渲染标签,从而产生非常高的闪烁率.
| 归档时间: |
|
| 查看次数: |
2038 次 |
| 最近记录: |