C# Winforms 选项卡控制选项卡宽度错误
Posted
技术标签:
【中文标题】C# Winforms 选项卡控制选项卡宽度错误【英文标题】:C# Win Forms tab Control tab width error 【发布时间】:2011-05-03 08:16:48 【问题描述】:我有自定义选项卡控件,其中 OnPaint 方法被覆盖。 然后出现奇怪的标签增长。标签越来越大(填充越来越大),它们的宽度取决于文本的长度。 当我使用默认选项卡控件时 - 填充是可以的。使用 UserPaint 时如何避免这种情况?
partial class Tab : TabControl
public Tab()
InitializeComponent();
Init();
private void Init()
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
protected override void OnPaint(PaintEventArgs e)
DrawTabPane(e.Graphics);
private void DrawTabPane(Graphics g)
if (!Visible)
return;
// here we draw our tabs
for (int i = 0; i < this.TabCount; i++)
DrawTab(g, this.TabPages[i], i);
internal void DrawTab(Graphics g, TabPage tabPage, int nIndex)
Rectangle recBounds = this.GetTabRect(nIndex);
RectangleF tabTextArea = recBounds;
Point[] pt = new Point[4];
pt[0] = new Point(recBounds.Left + 1, recBounds.Bottom);
pt[1] = new Point(recBounds.Left + 1, recBounds.Top + 1);
pt[2] = new Point(recBounds.Right - 1, recBounds.Top + 1);
pt[3] = new Point(recBounds.Right - 1, recBounds.Bottom);
Brush br = new SolidBrush(clr_tab_norm);
g.FillPolygon(br, pt);
br.Dispose();
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
br = new SolidBrush(clr_txt);
g.DrawString(tabPage.Text, Font, br, tabTextArea, stringFormat);
【问题讨论】:
请提供您覆盖的OnPaint
方法的代码
什么时候变大?我没看到。你能附上你的意思的图片吗?
好的。请参阅原始消息中的图片
【参考方案1】:
为 Windows 中内置的控件(如 TabControl)打开 ControlStyles.UserPaint 不是正确的做法。我假设错误在 GetTabRect() 中,它在 sn-p 中不可见。
相反,您应该使用 TabControl.DrawMode 属性并实现 DrawItem 事件。 MSDN Library 中有一个很好的例子。
【讨论】:
绘制项目。这是一个很好的解决方案,但不适合我,因为出现了焦点矩形。【参考方案2】:从图像中可以看出,您的代码将选项卡的大小设置为比它们需要的更宽。额外的填充出现在所有选项卡中,但在文本较长的选项卡中更明显。
我不能确定这是为什么,但我猜想计算标签大小的代码(基于字体度量)使用的字体与用于绘制标签的字体不同。
【讨论】:
以上是关于C# Winforms 选项卡控制选项卡宽度错误的主要内容,如果未能解决你的问题,请参考以下文章
在带有选项卡的 Winforms 的模型视图演示器中应该使用多少个演示器?
如何在powershell中使用winforms右键单击选项卡时捕获事件