Я пытаюсь установить DrawMode к OwnerDrawFixeddraw, а затем сделать Язычок титул так же TabControl делает с NormalDrawMode, но DrawString метод с параметрами по умолчанию дает разные результаты.Как нарисовать текст на вкладке 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