┏第67号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・ToolStripやToolStripContainerの外観を変更する -RenderModeプロパティ -Rendererプロパティ -ToolStripProfessionalRendererクラス -カスタムToolStripRenderer -ToolStripProfessionalRendererでToolStripの角を四角くする -ToolStripのVisualスタイルを無効にする ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── 今回も前回に引き続き、ToolStripとToolStripContainerに関する Tipsを紹介します。 ─────────────────────────────── ●ToolStripやToolStripContainerの外観を変更する ToolStripやToolStripContainer(以下まとめてToolStripとする)の 外観を変更するための方法として、RenderModeプロパティとRenderer プロパティが用意されています。 ★RenderModeプロパティ まずは、VS2005のデザイナを使って、手軽に外観を変更させてみまし ょう。 ToolStripやToolStripContentPanel、ToolStripPanelコントロールに は、RenderModeプロパティが用意されており、デザイナでこの値を変 更することができます。RenderModeプロパティをSystemに変更すると、 MS Office XPのような外観だったものが、エクスプローラのような地 味な外観に変化するのが分かるでしょう。このように、RenderModeプ ロパティをSystemにするとエクスプローラのような外観になり、 ProfessionalにするとMS Office XPのような外観になります。 RenderModeプロパティはデフォルトでManagerRenderModeになってい ますが、これは何でしょうか?実は、RenderModeプロパティが ManagerRenderModeの時は、静的プロパティであるToolStripManager. RenderModeとRendererプロパティが使われます。つまり、RenderMode プロパティがManagerRenderModeとなっているすべてのToolStrip(及 び、ToolStripContentPanel、ToolStripPanel)には、 ToolStripManager.RenderModeとRendererプロパティの設定が使われ ます。逆に言えば、、ToolStripManager.RenderModeあるいは Rendererの値を変更することにより、アプリケーション内のすべての ToolStripの外観を一度に変更することができるということです。 試しに、次のようなコードを実行してみてください。RenderModeが ManagerRenderModeのすべてのToolStrip、ToolStripContentPanel、 ToolStripPanelの外観が変更されることでしょう。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripManager.RenderMode = ToolStripManagerRenderMode.System ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripManager.RenderMode = ToolStripManagerRenderMode.System; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [URL]ToolStripManager.RenderMode プロパティ http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstripmanager.rendermode.aspx ★Rendererプロパティ もっと細かくToolStripの外観をカスタマイズするには、Rendererプ ロパティを設定することになります。そのためには、 ToolStripRendererクラスを継承したクラスを作成して、どのように 描画するかをすべて指定しなければなりません(具体的な方法は、後 述します)。 ただ、これはあまりに面倒です。そこで、.NET Framework 2.0では、 ToolStripRendererを継承した2つのクラス、 ToolStripSystemRendererとToolStripProfessionalRendererクラスが あらかじめ用意されています。 実は、RenderModeプロパティをSystemにするとRendererに ToolStripSystemRendererを使い、Professionalにすると ToolStripProfessionalRendererを使うということなのです。つまり、 先ほどのToolStripManager.RenderModeをSystemにするというコード は、次のようなコードであっても、外観がどうなるかという結果に関 しては、全く同じになります。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripManager.Renderer = New ToolStripSystemRenderer() ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripManager.Renderer = new ToolStripSystemRenderer(); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [URL]ToolStripManager.Renderer プロパティ http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstripmanager.renderer.aspx ★ProfessionalColorTableクラス ToolStripProfessionalRendererクラスには、ToolStripの外観の色を 変更するための、簡単で面白い方法が用意されています。RenderMode がProfessionalの時は、Office XPのような、グラデーションのかか ったカッコいい見た目になりますが、どのような色でグラデーション をかけるかを簡単に変更することができるのです。 そのためには、ProfessionalColorTableクラスを継承したクラスを作 成し、ここでグラデーションのかけ方を指定し、このオブジェクトを 指定して、ToolStripProfessionalRendererオブジェクトを作成しま す。 まずは例をご覧ください。はじめにProfessionalColorTableクラスを 継承したCustomProfessionalRendererクラスを作成します。ここでは、 ToolStripとToolStripPanelの色だけを変更しています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class CustomProfessionalRenderer Inherits ProfessionalColorTable 'ToolStripのグラデーションの色を指定 Public Overrides ReadOnly Property ToolStripGradientBegin() _ As Color Get Return Color.WhiteSmoke End Get End Property Public Overrides ReadOnly Property ToolStripGradientMiddle() _ As Color Get Return Color.LightGray End Get End Property Public Overrides ReadOnly Property ToolStripGradientEnd() _ As Color Get Return Color.Gray End Get End Property 'ToolStripPanelのグラデーションの色を指定 Public Overrides ReadOnly Property ToolStripPanelGradientBegin() _ As Color Get Return Color.Gold End Get End Property Public Overrides ReadOnly Property ToolStripPanelGradientEnd() _ As Color Get Return Color.Ivory End Get End Property End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ using System.Windows.Forms; using System.Drawing; public class CustomProfessionalRenderer : ProfessionalColorTable { //ToolStripのグラデーションの色を指定 public override Color ToolStripGradientBegin { get { return Color.WhiteSmoke; } } public override Color ToolStripGradientMiddle { get { return Color.LightGray; } } public override Color ToolStripGradientEnd { get { return Color.Gray; } } //ToolStripPanelのグラデーションの色を指定 public override Color ToolStripPanelGradientBegin { get { return Color.Gold; } } public override Color ToolStripPanelGradientEnd { get { return Color.Ivory; } } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripGradientBegin、ToolStripGradientMiddle、 ToolStripGradientEndプロパティでToolStripにかけるグラデーショ ンの開始色、中間色、終了色を指定し、 ToolStripPanelGradientBeginとToolStripPanelGradientEndで ToolStripPanelにかけるグラデーションの開始色と終了色を指定しま す。 このCustomProfessionalRendererを使って実際にToolStripと ToolStripPanelの外観を変更するには、次のようにします。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'アプリケーション全体にカスタムのプロフェッショナルレンダラを適用する ToolStripManager.Renderer = _ New ToolStripProfessionalRenderer( _ New CustomProfessionalRenderer()) ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //アプリケーション全体にカスタムのプロフェッショナルレンダラを適用する ToolStripManager.Renderer = new ToolStripProfessionalRenderer( new CustomProfessionalRenderer()); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 個々のToolStripやToolStripPanelのみを変更するのであれば、その コントロールのRendererにToolStripProfessionalRendererオブジェ クトを設定してください。 なお、Rendererにカスタムレンダラを設定すると、RenderModeプロパ ティは自動的にCustomとなります。 私がProfessionalColorTableを使ってみて気が付いた点を以下に挙げ ます。 ToolStripGradientMiddleを指定しないと、デフォルトの色が使われ るようですので、ToolStripGradientBeginとToolStripGradientEndを 変更するならば、ToolStripGradientMiddleも変更しないと、意図し た色にならないでしょう。(しかし、ButtonSelectedGradientMiddle やMenuItemPressedGradientMiddleなど、...Middleの他のメソッドは、 指定しても無視されました。) グラデーションの方向に関しては、MSDNに何の説明もありません。そ こで私が実際に試して調べた結果を記述しておきます。 ToolStripGradientBegin、ToolStripGradientMiddle、 ToolStripGradientEndによるToolStripのグラデーションでは、 ToolStripが横長(LayoutStyleがHorizontalStackWithOverflow)の 時は、左から右へのグラデーションとなり、ToolStripが縦長( LayoutStyleがVerticalStackWithOverflow)の時は、上から下へのグ ラデーションとなります。 ToolStripPanelGradientBegin、ToolStripPanelGradientEndによる ToolStripPanelのグラデーションでは、左から右へのグラデーション となります。しかし、必ずしもToolStripPanelの左端が ToolStripPanelGradientBeginで指定した色で、右端が ToolStripPanelGradientEndで指定した色とはならず、その間の一部 分のようにグラデーションがかかります。 MenuStripのMenuStripGradientBegin、MenuStripGradientEndでは、 MenuStripが横長の場合に、左から右へのグラデーションとなります。 縦長の場合は、グラデーションとならず、MenuStripGradientBeginで 指定した一色のみとなるようです。 MenuItemPressedGradientBegin、MenuItemPressedGradientEndなど、 MenuItemの場合は、上から下へのグラデーションとなります。(なお、 MenuItemPressedGradient...やMenuItemSelectedGradient...は、 ToolStripComboBoxの下矢印ボタンにも使用されます。) OverflowButtonGradientBegin、OverflowButtonGradientEndによるオー バーフローボタンは、MenuStripが横長の場合は上から下、横長の場 合は左から右のグラデーションとなります。(なお、 ToolStripOverflowButtonの選択時や、押した時の色は、 ButtonSelectedGradient...やButtonPressedGradient...が使用され ます。) ToolStripContainerのContentPanelのRendererはグラデーションとな らず、ToolStripContentPanelGradientEndで指定した一色となりまし た。 また、RaftingContainerGradientBeginと RaftingContainerGradientEndは全く無視され、どのようにすれば有 効になるのか分かりませんでした。 [URL]ProfessionalColorTable クラス http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.professionalcolortable.aspx [URL]ProfessionalColors メンバ http://msdn2.microsoft.com/ja-JP/library/system.windows.forms.professionalcolors.aspx [URL]方法 : ToolStrip アプリケーションの色をカスタマイズする http://msdn2.microsoft.com/ja-jp/library/ms229724.aspx [URL]方法 : 実行時に ToolStrip レンダラを設定する http://msdn2.microsoft.com/ja-JP/library/ms229637.aspx ★カスタムToolStripRenderer さらに細かくToolStripの外観を指定したい場合は、 ToolStripRendererクラスの派生クラスを独自に作成し、ToolStripを どのように描画するかを指定します。 ToolStripRendererクラスは抽象クラスですので、必ず派生クラスを 作成する必要があります。抽象メンバはありませんので、必ずオーバー ライドしなければならないメンバはありませんが、そのままでは画像 やテキストが表示されるだけで、使い物になりません。もし ToolStripRendererクラスを直接継承するのであれば、多くのメソッ ドをオーバーライドする必要があるでしょう。 [URL]ToolStripRenderer クラス http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstriprenderer.aspx もしToolStripSystemRendererやToolStripProfessionalRendererを基 にして、その一部分の描画を変更するだけであれば、これらのクラス を継承して、適当なメソッドをオーバーライドするだけでよいので、 簡単です。 以下に、ToolStripProfessionalRendererを継承して、 OnRenderToolStripBackgroundとOnRenderButtonBackgroundをオーバー ライドすることにより、ToolStripの背景とToolStripButtonの背景を 独自に描画する例を示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Public Class CustomRenderer Inherits ToolStripProfessionalRenderer 'ToolStripの背景を描画 Protected Overrides Sub OnRenderToolStripBackground( _ ByVal e As ToolStripRenderEventArgs) Dim b As New SolidBrush(Color.LightGray) e.Graphics.FillRectangle(b, e.AffectedBounds) b.Dispose() End Sub 'ToolStripButtonの背景を描画 Protected Overrides Sub OnRenderButtonBackground( _ ByVal e As ToolStripItemRenderEventArgs) Dim btn As ToolStripButton = CType(e.Item, ToolStripButton) Dim b As SolidBrush If btn.Pressed Or btn.Checked Then 'ボタンが押されている時 b = New SolidBrush(Color.LightSalmon) Else If btn.Selected Then 'ボタンが選択されている時 b = New SolidBrush(Color.Aquamarine) Else 'ボタンが普通の状態の時 b = New SolidBrush(Color.Silver) End If End If 'ボタンの背景を描画する e.Graphics.FillRectangle(b, btn.ContentRectangle) b.Dispose() End Sub End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ using System.Drawing; public class CustomRenderer : ToolStripProfessionalRenderer { //ToolStripの背景を描画 protected override void OnRenderToolStripBackground( ToolStripRenderEventArgs e) { SolidBrush b = new SolidBrush(Color.LightGray); e.Graphics.FillRectangle(b, e.AffectedBounds); b.Dispose(); } //ToolStripButtonの背景を描画 protected override void OnRenderButtonBackground( ToolStripItemRenderEventArgs e) { ToolStripButton btn = (ToolStripButton)e.Item; SolidBrush b; if (btn.Pressed || btn.Checked) { //ボタンが押されている時 b = new SolidBrush(Color.LightSalmon); } else if (btn.Selected) { //ボタンが選択されている時 b = new SolidBrush(Color.Aquamarine); } else { //ボタンが普通の状態の時 b = new SolidBrush(Color.Silver); } //ボタンの背景を描画する e.Graphics.FillRectangle(b, btn.ContentRectangle); b.Dispose(); } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [URL]方法 : プロフェッショナル スタイルの ToolStrip コントロール を作成する http://msdn2.microsoft.com/ja-JP/library/ms229725.aspx [URL]方法 : カスタムの ToolStripRenderer を実装する http://msdn2.microsoft.com/ja-jp/library/ms229720.aspx 実はこのようなカスタムのToolStripRendererクラスを作成しなくて も、ToolStripRendererクラスのイベントを処理することにより、同 じことができます。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Protected Overrides Sub OnLoad(ByVal e As EventArgs) MyBase.OnLoad(e) Dim proRenderer As New ToolStripProfessionalRenderer() AddHandler proRenderer.RenderToolStripBackground, _ AddressOf proRenderer_RenderToolStripBackground ToolStripManager.Renderer = proRenderer End Sub Private Sub proRenderer_RenderToolStripBackground( _ ByVal sender As Object, ByVal e As ToolStripRenderEventArgs) Dim b As New SolidBrush(Color.LightGray) e.Graphics.FillRectangle(b, e.AffectedBounds) b.Dispose() End Sub ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ protected override void OnLoad(EventArgs e) { base.OnLoad(e); ToolStripProfessionalRenderer proRenderer = new ToolStripProfessionalRenderer(); proRenderer.RenderToolStripBackground += new ToolStripRenderEventHandler( proRenderer_RenderToolStripBackground); ToolStripManager.Renderer = proRenderer; } private void proRenderer_RenderToolStripBackground( object sender, ToolStripRenderEventArgs e) { SolidBrush b = new SolidBrush(Color.LightGray); e.Graphics.FillRectangle(b, e.AffectedBounds); b.Dispose(); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★ToolStripProfessionalRendererでToolStripの角を四角くする ToolStripProfessionalRendererを使うと、デフォルトではToolStrip の角が丸くなりますが、ToolStripProfessionalRenderer. RenderToolStripBackgroundプロパティをFalseにすることにより、角 を四角くすることができます。ただそれだけです...。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Dim proRenderer As New ToolStripProfessionalRenderer() proRenderer.RoundedEdges = False ToolStripManager.Renderer = proRenderer ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ToolStripProfessionalRenderer proRenderer = new ToolStripProfessionalRenderer(); proRenderer.RoundedEdges = false; ToolStripManager.Renderer = proRenderer; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ★ToolStripのVisualスタイルを無効にする ToolStripManager.VisualStylesEnabledメソッドをFalseとすること により、ToolStripのVisualスタイル(Windows XPで使用されている 外観のスタイル)を無効にできます。つまり、VisualStylesEnabled メソッドをFalseとすると、ToolStripの見た目はWindows XPより古い Windowsで実行したExplore(レンダラがToolStripSystemRendererの 時)やMS Office XP(レンダラがToolStripProfessionalRendererの 時)のようになります。 今まで紹介してきたように、ProfessionalColorTableクラスや、 ToolStripRendererの派生クラスを使ってToolStripの外観を変更した 場合は、これらにより描画法が変更された箇所は VisualStylesEnabledメソッドの影響を受けないようです。逆に、 VisualStylesEnabledの値によりカスタムToolStripRendererの描画法 を変更したい場合は、ToolStripManager.VisualStylesEnabledの値を 見て描画法を変更するようにします。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'Visualスタイルを無効にする ToolStripManager.VisualStylesEnabled = False ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //Visualスタイルを無効にする ToolStripManager.VisualStylesEnabled = false; ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ─────────────────────────────── しつこいようですが、次回もToolStripに関するTipを紹介する予定で す。 =============================== ■ここで示したコードの多くはまずC#で書き、それを「C# to VB.NET Translator」でVB.NETのコードに変換し、修正を加えたものです。 [URL][URL]C# to VB.NET Translator http://authors.aspalliance.com/aldotnet/examples/translate.aspx ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2005-Oct 2006)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2006 DOBON! All rights reserved. ===============================