Imports System.Drawing.Drawing2D Imports System.Drawing.Text Imports System.ComponentModel Imports System.Windows.Forms _ Public Class MenuPanel Inherits System.Windows.Forms.Panel #Region " コンポーネント デザイナで生成されたコード " Public Sub New() MyBase.New() ' この呼び出しは、コンポーネント デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後に初期化を追加します。 End Sub 'Control は、コンポーネント一覧に後処理を実行するために、dispose をオーバーライドします。 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'コントロール デザイナで必要です。 Private components As System.ComponentModel.IContainer ' メモ : 以下のプロシージャはコンポーネント デザイナで必要です。 ' コンポーネント デザイナを使って変更できます。 ' コード エディタを使って変更しないでください。 Private Sub InitializeComponent() components = New System.ComponentModel.Container End Sub #End Region #Region "追加したプロパティ" Private panelTitleText As String = "" _ Public Property TitleText() As String Get Return Me.panelTitleText End Get Set(ByVal Value As String) Me.panelTitleText = Value Me.Invalidate() End Set End Property #End Region #Region "描画処理" Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs) ' パネルを描画する DrawPanel(pe.Graphics) ' 基本クラスOnPaintは実行しない 'MyBase.OnPaint(pe) End Sub Private Sub DrawPanel(ByVal g As Graphics) Dim rectPaint As Rectangle = Me.ClientRectangle If (rectPaint.Width <= 0) Or (rectPaint.Height <= 0) Then Return ' 描画しない End If ' 内部の背景を描画 rectPaint.Inflate(-2, -2) Dim brushBackground As New LinearGradientBrush(rectPaint, Me.BackColor, Color.White, LinearGradientMode.ForwardDiagonal) g.FillRectangle(brushBackground, rectPaint) brushBackground.Dispose() ' 描画時に線幅分右にはみ出るので、それを差し引いておく rectPaint.Width = rectPaint.Width - 1 rectPaint.Height = rectPaint.Height - 1 ' 内枠の白線を描画 rectPaint.Inflate(1, 1) g.DrawRectangle(New Pen(Color.White, 1), rectPaint) ' 外枠の背景色の線を描画 rectPaint.Inflate(1, 1) g.DrawRectangle(New Pen(Me.BackColor, 1), rectPaint) ' 文字列を描画 Dim brushText As New SolidBrush(Me.ForeColor) g.TextRenderingHint = TextRenderingHint.AntiAlias g.DrawString(Me.panelTitleText, Me.Font, brushText, 10, 10) brushText.Dispose() End Sub #End Region #Region "リサイズ時の描画処理の改善" ' OnResizeイベントのEventArgsパラメータを保持 Private resizeEeventArgs As EventArgs = Nothing 'フォームのサイズが変更した時 Protected Overrides Sub OnResize(ByVal e As System.EventArgs) MyBase.OnResize(e) ' 描画処理はアイドル時間に行う If resizeEeventArgs Is Nothing Then resizeEeventArgs = e ' デリゲートを追加 AddHandler Application.Idle, AddressOf OnIdleInvalidate End If End Sub ' アプリケーションがアイドル状態のときに呼び出されるデリゲート Private Sub OnIdleInvalidate(ByVal s As Object, ByVal e As EventArgs) If Not resizeEeventArgs Is Nothing Then ' 描画処理を行う Invalidate() ' デリゲートを削除 resizeEeventArgs = Nothing RemoveHandler Application.Idle, AddressOf OnIdleInvalidate End If End Sub #End Region End Class