如何在TabControl选项卡上绘制文本与TabControl完全相同?

时间:2016-06-28 12:25:15

标签: c# winforms tabcontrol

我正在尝试将 DrawMode 设置为 OwnerDrawFixeddraw ,然后以 TabControl Normal 相同的方式绘制标签标题> DrawMode ,但使用默认参数的 DrawString 方法会产生不同的结果。

在下面的示例中,如果文本设置为 Lorem ipsum ,则它可以正常工作,但如果将其设置为数字 - 则会在选项卡区域之外绘制。然而, TabControl 与普通 DrawMode 正确地绘制了一切,如何手动完成相同的操作?

using System.Drawing;
using System.Windows.Forms;

namespace TabWidthIssue
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; // Works fine!
            var text = "1234567890-1234567890-1234567890-1234567890-1234567890-123456789X"; // Does not fit!

            // TabControl with OwnerDrawFixed
            var ownerDrawFixedTabControl = new TabControl()
            {
                DrawMode = TabDrawMode.OwnerDrawFixed,
                Parent = this,
                Dock = DockStyle.Top,
            };

            ownerDrawFixedTabControl.DrawItem += new DrawItemEventHandler(ownerDrawFixedTabControl_DrawItem);

            ownerDrawFixedTabControl.TabPages.Add(new TabPage(text));

            // TabControl with Normal
            var normalTabControl = new TabControl()
            {
                DrawMode = TabDrawMode.Normal,
                Parent = this,
                Dock = DockStyle.Top,
            };

            normalTabControl.TabPages.Add(new TabPage(text));
        }

        void ownerDrawFixedTabControl_DrawItem(object sender, DrawItemEventArgs e)
        {
            var tabControl = sender as TabControl;
            var tabPage = tabControl.TabPages[e.Index];

            var format = new StringFormat
            {
                FormatFlags = StringFormatFlags.NoWrap,
                Trimming = StringTrimming.None
            };

            using (var brush = new SolidBrush(Color.Black))
                e.Graphics.DrawString(tabPage.Text, e.Font, brush, tabControl.GetTabRect(e.Index), format);
        }
    }
}

Example

更新1 以相同方式“绘制文本”的任务可以替换为“以相同方式测量文本”。我知道我要绘制的文本的大小(使用DrawStringDrawText),但我需要确保选项卡足够宽。 TextRenderer.MeasureText的宽度与创建的标签的实际宽度不匹配。

1 个答案:

答案 0 :(得分:1)

框架使用此

TextRenderer.DrawText(g, tabItemText, font, contentBounds, textColor, flags);