2016-06-28 4 views
0

나는 OwnerDrawFixeddraw 에 다음 기본 매개 변수와 정상DrawMode하지만 하여 drawString 방법 탭 타이틀을 을 TabControl가하는 같은 방법을 그리는 다른 결과를 제공 DrawMode을 설정하려합니다.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 enum TextFormatFlags .. –

+0

예, 문서에서 볼 수 있지만 프레임 워크에서 호출을 사용한다고 말하면 원본과 동일한 결과를 얻으려면 정확한 값 조합을 알아야합니다. 구현이 렌더링됩니다. –