我正在尝试将 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);
}
}
}
更新1 以相同方式“绘制文本”的任务可以替换为“以相同方式测量文本”。我知道我要绘制的文本的大小(使用DrawString
或DrawText
),但我需要确保选项卡足够宽。 TextRenderer.MeasureText
的宽度与创建的标签的实际宽度不匹配。
答案 0 :(得分:1)
框架使用此
TextRenderer.DrawText(g, tabItemText, font, contentBounds, textColor, flags);