2016-06-28 23 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

是的,我們可以看到,在文檔中,但你說框架使用調用,所以重要的是知道值的確切組合,以達到與原始相同的結果實現呈現。 –

相關問題