我想設置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