C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: TabControlのSizemode:Fixedで、左詰め


(過去ログ 129 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■76441 / inTopicNo.1)  TabControlのSizemode:Fixedで、左詰め
  
□投稿者/ こういち (8回)-(2015/07/12(Sun) 00:01:31)

分類:[VB.NET/VB2005 以降] 

TabControlにて、Sizemodeを「Fixed」にすると、タブの文字が中央表示されますが、
これを左詰めで表示する方法はありますでしょうか?

オブジェクトの承継すれば…と考えたのですが、実際のやりかたが全くわからず。。
参考ページ等でもかまいません、ご教示いただければ幸いです。
引用返信 編集キー/
■76468 / inTopicNo.2)  Re[1]: TabControlのSizemode:Fixedで、左詰め
□投稿者/ 魔界の仮面弁士 (401回)-(2015/07/13(Mon) 11:33:18)
No76441 (こういち さん) に返信
> TabControlにて、Sizemodeを「Fixed」にすると、タブの文字が中央表示されますが、
> これを左詰めで表示する方法はありますでしょうか?

DrawMode を OwnerDrawFixed にして、オーナードロー描画してみては如何でしょう。

Private Sub TabControl1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles TabControl1.DrawItem
 Dim tc = DirectCast(sender, TabControl)
 Dim tp = tc.TabPages(e.Index)

 ''タブの背景まで描画する場合は、ここのコメントを解除する
 'Dim state As TabItemState
 'If Not tc.Enabled Then
 ' state = TabItemState.Disabled '使用不可
 'ElseIf tc.SelectedIndex = e.Index Then
 ' state = TabItemState.Selected '選択中
 'Else
 ' state = TabItemState.Normal  '通常
 'End If
 'TabRenderer.DrawTabItem(e.Graphics, e.Bounds, state)

 '水平左寄せ,左右余白あり,垂直中央寄せ,クリップなし,長すぎる行の末尾に省略記号を付与
 Dim tff As TextFormatFlags = TextFormatFlags.Left Or TextFormatFlags.LeftAndRightPadding Or TextFormatFlags.VerticalCenter Or TextFormatFlags.NoClipping Or TextFormatFlags.EndEllipsis

 'テキスト描画
 TextRenderer.DrawText(e.Graphics, tp.Text, e.Font, e.Bounds, SystemColors.ControlText, tff)
End Sub


> オブジェクトの承継すれば…と考えたのですが、
承継(しょうけい)ではなく、
継承(けいしょう)と呼ばれます。
https://msdn.microsoft.com/ja-jp/library/c8shwxa5.aspx


オーナードローで物足りない場合は、TabControl を継承したクラスを作り、
OnPaint メソッドをオーバーロードしてカスタムドローしてみて下さい。
http://dobon.net/vb/dotnet/control/tabsidebug.html
引用返信 編集キー/
■76482 / inTopicNo.3)  Re[2]: TabControlのSizemode:Fixedで、左詰め
□投稿者/ こういち (9回)-(2015/07/14(Tue) 02:54:48)
No76468 (魔界の仮面弁士 さん) に返信
いつもありがとうございます。
ご丁寧にわかりやすくて助かります。

オーナードローですと、元の表示とだいぶ変わってしまい一から記載するのは大変そうですね。


> Private Sub TabControl1_DrawItem(sender As Object, e As DrawItemEventArgs) Handles TabControl1.DrawItem
>  Dim tc = DirectCast(sender, TabControl)
>  Dim tp = tc.TabPages(e.Index)
>
>  ''タブの背景まで描画する場合は、ここのコメントを解除する
>  'Dim state As TabItemState
>  'If Not tc.Enabled Then
>  ' state = TabItemState.Disabled '使用不可
>  'ElseIf tc.SelectedIndex = e.Index Then
>  ' state = TabItemState.Selected '選択中
>  'Else
>  ' state = TabItemState.Normal  '通常
>  'End If
>  'TabRenderer.DrawTabItem(e.Graphics, e.Bounds, state)
>
>  '水平左寄せ,左右余白あり,垂直中央寄せ,クリップなし,長すぎる行の末尾に省略記号を付与
>  Dim tff As TextFormatFlags = TextFormatFlags.Left Or TextFormatFlags.LeftAndRightPadding Or TextFormatFlags.VerticalCenter Or TextFormatFlags.NoClipping Or TextFormatFlags.EndEllipsis
>
>  'テキスト描画
>  TextRenderer.DrawText(e.Graphics, tp.Text, e.Font, e.Bounds, SystemColors.ControlText, tff)
> End Sub
>
>
>>オブジェクトの承継すれば…と考えたのですが、
> 承継(しょうけい)ではなく、
> 継承(けいしょう)と呼ばれます。
> https://msdn.microsoft.com/ja-jp/library/c8shwxa5.aspx

失礼しましたー。

>
> オーナードローで物足りない場合は、TabControl を継承したクラスを作り、
> OnPaint メソッドをオーバーロードしてカスタムドローしてみて下さい。
> http://dobon.net/vb/dotnet/control/tabsidebug.html

そうですね。イメージ的にはオーナードローですべてて記載するのはしんどいので、
参考URLを元にいろいろ触ってみます。

ありがとうございました。
解決済み
引用返信 編集キー/
■76486 / inTopicNo.4)  Re[3]: TabControlのSizemode:Fixedで、左詰め
□投稿者/ 魔界の仮面弁士 (407回)-(2015/07/14(Tue) 10:59:19)
2015/07/14(Tue) 11:00:37 編集(投稿者)

No76482 (こういち さん) に返信
> オーナードローですと、元の表示とだいぶ変わってしまい一から記載するのは大変そうですね。

描画内容を近づけてみました。
事前に、ItemSize プロパティも設定しておいた方が良いかもしれません。

Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles

Public Class VisualTabControl
 Inherits TabControl

 Public Sub New()
  MyBase.New()
  Me.SetStyle(ControlStyles.UserPaint, True)
  Me.DoubleBuffered = True
  Me.ResizeRedraw = True
  'ControlStyles.UserPaintをTrueすると、
  'SizeModeは強制的にTabSizeMode.Fixedにされる
  Me.SizeMode = TabSizeMode.Fixed
 End Sub

 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
  MyBase.OnPaint(e)
  e.Graphics.FillRectangle(SystemBrushes.Control, Me.ClientRectangle)
  If Me.TabPages.Count = 0 Then
   Return
  End If

  Dim page As TabPage = Me.TabPages(Me.SelectedIndex)
  Dim pageRect As New Rectangle(page.Bounds.X - 2, _
          page.Bounds.Y - 2, _
          page.Bounds.Width + 5, _
          page.Bounds.Height + 5)
  TabRenderer.DrawTabPage(e.Graphics, pageRect)

  For i As Integer = 0 To Me.TabPages.Count - 1
   DrawTab(e.Graphics, i)
  Next
 End Sub

 Private Sub DrawTab(g As Graphics, index As Integer)
  Dim page As TabPage = Me.TabPages(index)
  Dim tabRect As Rectangle = Me.GetTabRect(index)

  Dim state As TabItemState
  If Not Me.Enabled Then
   state = TabItemState.Disabled
  ElseIf tabRect.Contains(Me.PointToClient(Control.MousePosition)) Then
   state = TabItemState.Hot
  ElseIf Me.SelectedIndex = index Then
   state = TabItemState.Selected
  Else
   state = TabItemState.Normal
  End If

  If Me.SelectedIndex = index Then
   tabRect.Y -= 2
   tabRect.Height += 2
  End If

  'タブの下にできる空白部分を消すため、高さを増やす
  tabRect.Height += 1

  'テキストなしで描画
  TabRenderer.DrawTabItem(
   g, _
   tabRect, _
   "", _
   page.Font, _
   False, _
   state)

  'テキストを左寄せで追加描画
  Dim tff As TextFormatFlags = TextFormatFlags.Left Or TextFormatFlags.LeftAndRightPadding _
    Or TextFormatFlags.VerticalCenter Or TextFormatFlags.NoClipping Or TextFormatFlags.EndEllipsis
  TextRenderer.DrawText(g, page.Text, page.Font, tabRect, page.ForeColor, tff)
 End Sub

 Private trackingTab As Integer = -1

 Protected Overrides Sub OnMouseLeave(e As EventArgs)
  MyBase.OnMouseLeave(e)
  trackingTab = -1
  Invalidate()
 End Sub

 Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
  MyBase.OnMouseMove(e)
  For i As Integer = 0 To Me.TabPages.Count - 1
   If Me.GetTabRect(i).Contains(e.Location) Then
    If trackingTab <> i Then
     trackingTab = i
     Me.Invalidate()
     Exit For
    End If
   End If
  Next
 End Sub
End Class
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -