2016-02-25 92 views
1

我在旋转选项卡上的文本时出现了一些问题。标签原本工作得很好,但我想在选中时加粗文字,所以我使用了Draw Item Event。我添加了一个RotateTransform和一个TranslateTransform,但它不起作用。文本只是不显示。我有麻烦了,如果我把旋转移开,文本是可见的,但是当我使用旋转使文本垂直时,它会消失。这里是我的代码:C#选项卡旋转文本

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     string tabText = tabControl1.TabPages[e.Index].Text; 
     SizeF textSize = g.MeasureString(tabText, tabControl1.Font); 
     Brush _textBrush = Brushes.Black; 
     TabPage _tabPage = tabControl1.TabPages[e.Index]; 
     System.Drawing.Rectangle _tabBounds = tabControl1.GetTabRect(e.Index); 
     StringFormat _stringFlags = new StringFormat(); 
     _stringFlags.Alignment = StringAlignment.Center; 
     _stringFlags.LineAlignment = StringAlignment.Center; 

     PointF tabPt = new PointF(_tabBounds.Left+(_tabBounds.Width), _tabBounds.Top+(_tabBounds.Height)); 

     if (e.Index == tabControl1.SelectedIndex) 
     { 
      g.RotateTransform(-90); 
      g.TranslateTransform(tabPt.X, tabPt.Y); 

      g.DrawString(tabControl1.TabPages[e.Index].Text, 
       new Font(tabControl1.Font, FontStyle.Bold), 
       _textBrush, 
       new PointF(tabPt.X, tabPt.Y)); 
      g.ResetTransform(); 
     } 
     else 
     { 
      g.TranslateTransform(tabPt.X, tabPt.Y);     
      g.RotateTransform(-90); 

      g.DrawString(tabControl1.TabPages[e.Index].Text, 
       tabControl1.Font, 
       _textBrush, 
       new PointF(tabPt.X,tabPt.Y)); 
      g.ResetTransform(); 
     } 
    } 
} 

任何帮助将不胜感激。

编辑 以下是图像:

enter image description here

这里的新代码:

 Graphics g = e.Graphics; 
     string tabText = tabControl1.TabPages[e.Index].Text; 
     SizeF textSize = g.MeasureString(tabText, tabControl1.Font); 
     Brush _textBrush = Brushes.Black; 
     TabPage _tabPage = tabControl1.TabPages[e.Index]; 
     System.Drawing.Rectangle _tabBounds = tabControl1.GetTabRect(e.Index); 
     PointF rotPt = new PointF(_tabBounds.Left + (_tabBounds.Width/2) - (2.75F), _tabBounds.Top + (_tabBounds.Height/2) + (textSize.Width/2)); 
     PointF tabPt = new PointF(_tabBounds.Left + (_tabBounds.Width/2) - (2.75F), _tabBounds.Top + (_tabBounds.Height/2) + (textSize.Width)/2); 
     if (e.Index == tabControl1.SelectedIndex) 
     { 
      g.TranslateTransform(rotPt.X, rotPt.Y); 
      g.RotateTransform(-90); 
      g.TranslateTransform(-(rotPt.X), -(rotPt.Y)); 

      g.DrawString(tabText, 
       new Font(tabControl1.Font, FontStyle.Bold), 
       _textBrush, 
       new PointF(rotPt.X, rotPt.Y)); 
     } 
     else 
     { 
      g.TranslateTransform(rotPt.X, rotPt.Y); 
      g.RotateTransform(-90); 
      g.TranslateTransform(-rotPt.X, -rotPt.Y); 

      g.DrawString(tabText, 
       tabControl1.Font, 
       _textBrush, 
       new PointF(rotPt.X,rotPt.Y)); 
     } 
+0

旋转点可能是关闭的!这是很难得到正确的。用1-5度的小角度进行测试! – TaW

+0

您是否对旋转点的精确计算有所了解?它似乎不是加载到TranslateTransform函数中的点。 – akb

+0

对不起,我只是看着你的代码更接近一点。你需要做到这一点:翻译,旋转,翻译回来,抽绳!测试时添加一个trackbar帮助很多! – TaW

回答

1

TAW感谢您的帮助。这是最终的代码和它的工作。

public form1() 
    { 
     InitializeComponent();    
     tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; 
     tabControl1.DrawItem += new DrawItemEventHandler(tabControl1_DrawItem); 
    } 

私人无效tabControl1_DrawItem(对象发件人,DrawItemEventArgs E)

{ 
     Graphics g = e.Graphics; 
     string tabText = tabControl1.TabPages[e.Index].Text; 
     SizeF textSize = g.MeasureString(tabText, tabControl1.Font); 
     Brush _textBrush = Brushes.Black; 
     TabPage _tabPage = tabControl1.TabPages[e.Index]; 
     System.Drawing.Rectangle _tabBounds = tabControl1.GetTabRect(e.Index); 
     PointF rotPt = new PointF(_tabBounds.Left + (_tabBounds.Width/2) - (textSize.Height/2), _tabBounds.Top + (_tabBounds.Height/2) + (textSize.Width/2)); 

     if (e.State.HasFlag(DrawItemState.Selected)) 
     { 
      g.TranslateTransform(rotPt.X, rotPt.Y); 
      g.RotateTransform(-90); 
      g.TranslateTransform(-(rotPt.X), -(rotPt.Y)); 

      g.DrawString(tabText, 
       new Font(tabControl1.Font, FontStyle.Bold), 
       _textBrush, 
       new PointF(rotPt.X, rotPt.Y)); 
      g.ResetTransform(); 
     } 

     else 
     { 
      g.TranslateTransform(rotPt.X, rotPt.Y); 
      g.RotateTransform(-90); 
      g.TranslateTransform(-rotPt.X, -rotPt.Y); 

      g.DrawString(tabText, 
       tabControl1.Font, 
       _textBrush, 
       new PointF(rotPt.X,rotPt.Y)); 
      g.ResetTransform(); 
     } 
    } 

P.S.我从来没有得到e.Bounds而不是GetTabRect(我不知道如何将其设置到选定的选项卡)。