| 
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2009/12/26 16:48
名前: 花ちゃん
 
************************************************************************************ カテゴリー:[その他コントロール][描画・画像][]                              *
 * キーワード:TabControl,オーナードロー,タブの表示位置,タブのテキスト             *
 ***********************************************************************************
 タイトル : タブを左にすると文字が表示されない
 記 事 No : 4616
 投 稿 日 : 2006/12/03(Sun) 16:32
 元質問者 : tomo
 
 タブを左側(もしくは右)にするとタブのtextが出てこなくなってしまいます
 
 又、タブを下側にするとXPの場合、丸みがある部分が上側にきてしまうため見た目が変に
 なってしまいます
 
 --------------------------------------------------------------------------------
 ちょっと便利な検索ソフト(http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=117)
 を使って、キーワード【TabControl TabDrawMode.OwnerDrawFixed】での検索結果
 (当サイト内・外の検索でも同じ)  ----- by 花ちゃん -----
 ヒット件数    検索対象サイト名    検索結果のURL(短く変換しています)
 890 件  ■ウェブ全体から検索       http://tinyurl.com/6zcczy
 96 件  ●msdn.microsoft.com/      http://tinyurl.com/6y4dcv
 3 件  DOBON.NET                  http://tinyurl.com/6s6wj8
 2 件  ★VBレスキュー(花ちゃん)   http://tinyurl.com/5aqreh
 1 件  Programing Library         http://tinyurl.com/6jc6pv
 1 件  わんくま同盟               http://tinyurl.com/5gerqb
 --------------------------------------------------------------------------------
 
 -----------------------------------------------------------------------------------
 記事No : 4617・4618
 投稿日 : 2006/12/04(Mon) 05:38
 回答者 : 魔界の仮面弁士
 -----------------------------------------------------------------------------------
 Windows XP の ビジュアルスタイルを有効にしていませんか?
 
 クラシックモード(Classic)の場合は、横方向のタブが存在しますが、
 Lunaモード(Whistler)の場合、上方向のタブしか存在しないため、
 TabAlignment.Left などを指定すると、表示が崩れてしまいます。
 
 ゆえに選択肢は、Windows のテーマを、横方向タブを持ったスタイルにして運用するか、
 タブ機能を自力実装するか(ただし、TabRenderer クラスは使えませんが)、
 オーナードローで誤魔化すか、そもそも、横方向タブを使うのを諦めるか……など。
 
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
 TabControl1.Alignment = TabAlignment.Left
 
 'オーナードローモードを使用
 TabControl1.DrawMode = TabDrawMode.OwnerDrawFixed
 'ページ部分のVisualStyleを無効化
 For Each page As TabPage In TabControl1.TabPages
 page.UseVisualStyleBackColor = False
 Next
 End Sub
 
 'タブ部分のオーナードロー処理。
 Private Sub TabControl1_DrawItem(ByVal sender As Object, ByVal e As DrawItemEventArgs) Handles TabControl1.DrawItem
 Dim tab As TabControl = DirectCast(sender, TabControl)
 Dim page As TabPage = tab.TabPages(e.Index)
 Dim g As Graphics = e.Graphics
 
 '背景塗りつぶし
 Using backBrush As New SolidBrush(page.BackColor)
 g.FillRectangle(backBrush, e.Bounds)
 End Using
 
 '文字を回転させて描画
 Using foreBrush As New SolidBrush(page.ForeColor), _
 sf As New StringFormat(StringFormat.GenericDefault)
 sf.Alignment = StringAlignment.Center
 sf.LineAlignment = StringAlignment.Center
 g.TranslateTransform(e.Bounds.X + e.Bounds.Width \ 2, e.Bounds.Y + e.Bounds.Height \ 2)
 Select Case tab.Alignment
 Case TabAlignment.Left
 g.RotateTransform(-90.0F)
 Case TabAlignment.Right
 g.RotateTransform(90.0F)
 Case Else
 'Top/Bottomは無回転
 End Select
 g.DrawString(page.Text, e.Font, foreBrush, 0, 0, sf)
 End Using
 End Sub
 
 なお、左右のタブで文字を±90°回転させたくない場合には、Graphics.RotateTransform を
 使うのではなく、StringFormatFlags.DirectionVertical を用いて縦書きすると良いかも。
 
 上記実行結果(画像をクリックすると元のサイズで見られます)
 オーナードローをしない場合            上記コードの実行結果
 
      |