2016-06-28 27 views
0

我想设置DrawModeOwnerDrawFixeddraw然后绘制分页标题与普通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); 
     } 
    } 
} 

Example

更新1“绘制文本”的任务,以同样的方式可以通过“测量文本以同样的方式”来代替。我知道我要绘制的文字大小(DrawStringDrawText),但我需要确保选项卡足够宽。从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

关于提供给该呼叫的确切'flags'的一些信息可能会有用,否则为+1。 –

+0

好吧,它是枚举TextFormatFlags .. –

+0

是的,我们可以看到,在文档中,但你说框架使用调用,所以重要的是知道值的确切组合,以达到与原始相同的结果实现呈现。 –

相关问题