2011-09-14 12 views
2

Windows XPとWindows 7では、タブコントロールの奇妙な動作に直面しています。タブ上に配置されたXPテキストは折り返され、7ではありません。タブで問題は何ですか? enter image description hereWindowsフォームのカスタムタブコントロール

PS。英語以外の文字は

UPDATEをラップしている:これはここでカスタムタブコントロール

コードです:

protected override void OnPaint(PaintEventArgs e) 
    { 
     DrawControl(e.Graphics); 
    } 

internal void DrawControl(Graphics g) 
    { 
     if (!Visible) 
      return; 

     Brush br = new SolidBrush(clr_cl_area); 
     Brush brTab = new SolidBrush(clr_client); 

     Rectangle TabControlArea = ClientRectangle; 
     Rectangle TabArea = DisplayRectangle; 

     g.FillRectangle(br, TabControlArea); 
     g.FillRectangle(brTab, TabArea); 

     br.Dispose(); 
     brTab.Dispose(); 

     for (int i = 0; i < TabCount; i++) 
      DrawTab(g, TabPages[i], i, false); 

     if (_mouseTabIndex != null && _mouseTabIndex != _mouseTabIndexSave && _mouseTabIndex != SelectedIndex) 
      DrawTab(g, TabPages[(int)_mouseTabIndex], (int)_mouseTabIndex, true); 

     _mouseTabIndexSave = _mouseTabIndex; 

    } 

    internal void DrawTab(Graphics g, TabPage tabPage, int nIndex, bool mouseOverTab) 
    { 

     var recBounds = GetTabRect(nIndex); 


     SetBounds(ref recBounds); 
     var pt = SetPointsForTabFill(recBounds); 


     DrawTabBounds(g, recBounds); 


     FillTabl(g, recBounds, pt, false); 


     DrawTabSeparators(g, recBounds, nIndex, 0 /*y-bottom*/); 


     if (SelectedIndex == nIndex) 
     {  
      DrawTabGradient(g, recBounds, pt, nIndex,0/*width*/,1/*height*/); 
      DrawTabSeparators(g, recBounds, nIndex, 1 /*y-bottom*/); 
     } 

     if (mouseOverTab) 
      DrawTabGradient(g, recBounds, pt, nIndex, -2/*width*/, 0/*height*/); 

     DrawText(g, recBounds, tabPage.Text); 

    } 

    private void DrawText(Graphics g, Rectangle recBounds, string text) 
    { 
     var strFormat = new StringFormat(); 
     strFormat.Alignment = strFormat.LineAlignment = StringAlignment.Center; 

     g.TextRenderingHint = 
      System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; 

     //var fnt = new Font(MsFonts.familyPTSans, 8F, FontStyle.Regular, GraphicsUnit.Point, (byte)204); 
     var fnt = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(204))); 

     RectangleF tabTextArea = recBounds; 
     var br = new SolidBrush(clr_txt); 
     g.DrawString(text, fnt, br, tabTextArea, FormatString()); 

     br.Dispose(); 
     strFormat.Dispose(); 
     fnt.Dispose(); 
    } 
+6

標準のWinForms TabControlですか?そうではありませんか?あなたの質問に「カスタムコントロール」というタグを付けましたが、カスタムコントロールについては何も教えてくれませんでした。 –

+1

あなた自身のコントロールであれば、 'TextRenderer'を' TextFormatFlags'を使って 'DrawText'に使うことができます。つまり、指定されたフォントの幅がワイドであるかどうかをチェックし、' WordEllipsis'または 'WordBreak'フラグ...だからあなたは同じ一般的な振る舞いをしています。 – Cipi

+0

標準のTabControlは折り返されません。 –

答えて

1

この問題が発生したのはなぜ?私は確信していません...私はフレームワークが基礎となるWindows APIを使用していると信じています。したがって、Windowsのバージョンによって異なる場合、.Netアプリケーションは少し異なって見える/動作するかもしれません。これを世話するかもしれない文化/文字列の動作設定があるかどうか疑問に思います...

とにかく、あなたの問題にはちょっとした効果的な解決策があります:あなたのテキストに改行を挿入するだけです。タブ(私はあなたがデザイナーからこれを行うことができますか分からない)。これは、独自のC#コードまたはデザイナーのコードビハインドC#から行うことができます。追加のテキスト行に対応するには、タブサイズを大きくする必要があります。

 // Set the size of the tabs. I multiply the default height by 2 for 2 lines 
     tabControl1.ItemSize = new System.Drawing.Size(77, 18 * 2); 

     // Force a line break within the string 
     tabControl1.Controls[0].Text = "Hello\r\nWorld"; 
+0

ありがとう!私はそれを試してみます! –

関連する問題