我有自定义选项卡控件,其中OnPaint方法被覆盖。 然后发生奇怪的标签增长。标签越来越大(填充越来越大),它们的宽度取决于文本的长度。 当我使用默认的Tab控件 - 填充是可以的。当我使用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);
}
}
答案 0 :(得分:2)
启用ControlStyles.UserPaint以获取内置于Windows中的控件(如TabControl),这不是正确的做法。我假设错误在GetTabRect()中,它在代码段中不可见。
相反,您应该使用TabControl.DrawMode属性并实现DrawItem事件。在MSDN Library中有一个很好的例子。
答案 1 :(得分:2)
从图像中可以看出,您的代码将标签的大小设置为比它们需要的更宽。额外填充在所有选项卡中都有,但在文本较长的选项卡中更加明显。
我无法确定为什么会这样,但我猜测计算标签大小的代码(基于字体指标)使用的字体与用于绘制标签的字体不同。