tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
TabControlのタブの表示位置をオーナードローで描画する(VB.NET) ( No.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 を用いて縦書きすると良いかも。

 上記実行結果(画像をクリックすると元のサイズで見られます)
オーナードローをしない場合            上記コードの実行結果



 [スレッド一覧へ] [親スレッドへ]