.NET Framework 2.0から追加されたStatusStripでは、パネルの色やフォントを変更するのは簡単です。ToolStripStatusLabelをパネルとして使用しているならば、Fontプロパティでフォントを変更できます。また、ForeColorプロパティで前景色を、BackColorプロパティで背景色を変更できます。
StatusBarのパネルの色とフォントを変更する方法は、マイクロソフトサポート技術情報の「HOW TO: Change the Color and the Font of the StatusBarPanel Object by Using Visual Basic .NET」「HOW TO: Change the Color and the Font of the StatusBarPanel Object by Using Visual C# .NET」などで紹介されています。
ここでは専用のクラスを作成する方法を紹介します。まず、StatusBarPanelクラスから派生した新しいクラス(ColorPanelクラス)を作成します。
Imports System Imports System.Drawing Imports System.Windows.Forms ''' <summary> ''' 色とフォントを変更できるStatusBarのPanel ''' </summary> Public Class ColorPanel Inherits StatusBarPanel Private _font As Font = Nothing ''' <summary> ''' 使用するフォント ''' </summary> Public Property Font() As Font 'StatusBarを再描画する Get Return _font End Get Set(ByVal Value As Font) _font = Value If Not (Me.Parent Is Nothing) Then Me.Parent.Refresh() End If End Set End Property Private _foreColor As Color = Color.Empty ''' <summary> ''' 前景色 ''' </summary> Public Property ForeColor() As Color 'StatusBarを再描画する Get Return _foreColor End Get Set(ByVal Value As Color) _foreColor = Value If Not (Me.Parent Is Nothing) Then Me.Parent.Refresh() End If End Set End Property Private _backColor As Color = Color.Empty ''' <summary> ''' 背景色 ''' </summary> Public Property BackColor() As Color 'StatusBarを再描画する Get Return _backColor End Get Set(ByVal Value As Color) _backColor = Value If Not (Me.Parent Is Nothing) Then Me.Parent.Refresh() End If End Set End Property ''' <summary> ''' コンストラクタ ''' </summary> ''' <param name="sb">パネルを追加するStatusBar</param> Public Sub New(ByVal sb As StatusBar) 'オーナードローを指定する Me.Style = StatusBarPanelStyle.OwnerDraw 'StatusBarのDrawItemイベントハンドラの追加 AddHandler sb.DrawItem, AddressOf sb_DrawItem End Sub Private Sub sb_DrawItem(ByVal sender As Object, _ ByVal sbdevent As StatusBarDrawItemEventArgs) '描画するパネルが自分自身か確かめる If sbdevent.Panel.Equals(Me) Then '文字の配置位置を決定 Dim sf As New StringFormat If Me.Alignment = HorizontalAlignment.Left Then sf.Alignment = StringAlignment.Near Else If Me.Alignment = HorizontalAlignment.Center Then sf.Alignment = StringAlignment.Center Else If Me.Alignment = HorizontalAlignment.Right Then sf.Alignment = StringAlignment.Far End If sf.LineAlignment = StringAlignment.Center '前景色、背景色のブラシを作成 Dim foreBrush As Brush If _foreColor.IsEmpty = False Then foreBrush = New SolidBrush(_foreColor) Else foreBrush = New SolidBrush(sbdevent.ForeColor) End If Dim backBrush As Brush If _backColor.IsEmpty = False Then backBrush = New SolidBrush(_backColor) Else backBrush = New SolidBrush(sbdevent.BackColor) End If '使用するフォントを決定 Dim fnt As Font If Not (_font Is Nothing) Then fnt = _font Else fnt = sbdevent.Font End If '背景を描画 sbdevent.Graphics.FillRectangle(backBrush, sbdevent.Bounds) '文字列を描画 Dim rectf As New RectangleF( _ sbdevent.Bounds.X, sbdevent.Bounds.Y, _ sbdevent.Bounds.Width, sbdevent.Bounds.Height) sbdevent.Graphics.DrawString(Me.Text, fnt, foreBrush, rectf, sf) '破棄 foreBrush.Dispose() backBrush.Dispose() End If End Sub End Class
using System; using System.Drawing; using System.Windows.Forms; /// <summary> /// 色とフォントを変更できるStatusBarのPanel /// </summary> public class ColorPanel : StatusBarPanel { private Font _font = null; /// <summary> /// 使用するフォント /// </summary> public Font Font { set { _font = value; //StatusBarを再描画する if (this.Parent != null) { this.Parent.Refresh(); } } get { return _font; } } private Color _foreColor = Color.Empty; /// <summary> /// 前景色 /// </summary> public Color ForeColor { set { _foreColor = value; //StatusBarを再描画する if (this.Parent != null) { this.Parent.Refresh(); } } get { return _foreColor; } } private Color _backColor = Color.Empty; /// <summary> /// 背景色 /// </summary> public Color BackColor { set { _backColor = value; //StatusBarを再描画する if (this.Parent != null) { this.Parent.Refresh(); } } get { return _backColor; } } /// <summary> /// コンストラクタ /// </summary> /// <param name="sb">パネルを追加するStatusBar</param> public ColorPanel(StatusBar sb) { //オーナードローを指定する this.Style = StatusBarPanelStyle.OwnerDraw; //StatusBarのDrawItemイベントハンドラの追加 sb.DrawItem += new StatusBarDrawItemEventHandler(sb_DrawItem); } private void sb_DrawItem(object sender, StatusBarDrawItemEventArgs sbdevent) { //描画するパネルが自分自身か確かめる if (sbdevent.Panel == this) { //文字の配置位置を決定 StringFormat sf = new StringFormat(); if (this.Alignment == HorizontalAlignment.Left) sf.Alignment = StringAlignment.Near; else if (this.Alignment == HorizontalAlignment.Center) sf.Alignment = StringAlignment.Center; else if (this.Alignment == HorizontalAlignment.Right) sf.Alignment = StringAlignment.Far; sf.LineAlignment = StringAlignment.Center; //前景色、背景色のブラシを作成 Brush foreBrush; if (_foreColor != Color.Empty) foreBrush = new SolidBrush(_foreColor); else foreBrush = new SolidBrush(sbdevent.ForeColor); Brush backBrush; if (_backColor != Color.Empty) backBrush = new SolidBrush(_backColor); else backBrush = new SolidBrush(sbdevent.BackColor); //使用するフォントを決定 Font fnt; if (_font != null) fnt = _font; else fnt = sbdevent.Font; //背景を描画 sbdevent.Graphics.FillRectangle( backBrush, sbdevent.Bounds); //文字列を描画 sbdevent.Graphics.DrawString( this.Text, fnt, foreBrush, sbdevent.Bounds, sf); //破棄 foreBrush.Dispose(); backBrush.Dispose(); } } }
このクラスを使用してステータスバーに、前景色が赤、背景色が黄色、フォントがMS 明朝の太字で文字列が表示されるパネルを追加する例を以下に示します。
'パネルを表示する StatusBar1.ShowPanels = True 'ColorPanelの作成 Dim cp As New ColorPanel(StatusBar1) 'プロパティを変更する cp.ForeColor = Color.Red cp.BackColor = Color.White cp.Font = New Font("MS 明朝", 9, FontStyle.Bold) cp.Text = "テストです" 'StatusBar1のパネルに追加する StatusBar1.Panels.Add(cp)
//パネルを表示する StatusBar1.ShowPanels = true; //ColorPanelの作成 ColorPanel cp = new ColorPanel(StatusBar1); //プロパティを変更する cp.ForeColor = Color.Red; cp.BackColor = Color.White; cp.Font = new Font("MS 明朝", 9, FontStyle.Bold); cp.Text = "テストです"; //StatusBar1のパネルに追加する StatusBar1.Panels.Add(cp);