我想设置DrawMode到OwnerDrawFixeddraw然后绘制分页标题与普通DrawMode,但的DrawString方法使用默认参数相同的方式的TabControl确实给出了不同的结果。如何在TabControl的选项卡上以与TabControl完全相同的方式绘制文本?
在下面的例子中,如果文字设置为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
的宽度与创建的标签的实际宽度不匹配。
见[此](http://stackoverflow.com/q/7268238/1997232)。 – Sinatr
所有本机控件都使用TextRenderer.DrawText()来呈现文本。它与DrawString()有细微的差别。否则,由你来确保选项卡足够宽以适应文本,尽量避免与该字符串非常不切实际的事情。 –
@HansPassant选项卡的宽度根据文本自动计算,是否有任何其他方式显式指定选项卡宽度(除了'ItemSize'属性,因为我需要选项卡具有不同的宽度)。 – Eugene