2016-06-28 2 views
0

Я пытаюсь установить 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); 
     } 
    } 
} 

Example

Обновление 1 Задача «рисование текста» таким же образом, может быть заменено на «измерении текста таким же образом». Я знаю размер текста, который я собираюсь нарисовать (либо DrawString, либо DrawText), но мне нужно убедиться, что вкладка достаточно широкая. Ширина от TextRenderer.MeasureText не соответствует фактической ширине созданной вкладки.

+0

См [это] (http://stackoverflow.com/q/7268238/1997232). – Sinatr

+0

Все встроенные элементы управления используют TextRenderer.DrawText() для визуализации текста. Он тонко отличается от DrawString(). В противном случае вы должны убедиться, что вкладка достаточно широка, чтобы соответствовать тексту, избегать чего-то столь же непрактичного, как эта строка. –

+0

@HansPassant Ширина закладки рассчитывается автоматически на основе текста, есть ли альтернативный способ явного указания ширины табуляции (за исключением свойства ItemSize для того, чтобы мне нужно, чтобы вкладки имели разную ширину). – Eugene

ответ

1

рамки использует этот

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

Небольшая информация о точном флажке, предоставляемом вызову, может быть полезна, иначе +1. –

+0

ok это перечисление TextFormatFlags .. –

+0

Да, мы можем видеть, что в документах, но вы говорите, что фреймворк использует вызов, поэтому было бы важно знать точную комбинацию значений для достижения того же результата, что и исходный реализации. –

Смежные вопросы