|
.NET TIPS 独自にサイズ・グリップを描画するには?[2.0、3.0、3.5、C#、VB]デジタルアドバンテージ 一色 政彦2010/02/18 |
![]() |
|
|
|
「TIPS:フォーム全体へのドッキング状態でサイズ変更つまみを表示するには?」では、Windowsフォームがサイズ変更可能であることを明示する右下のつまみ(以降、サイズ・グリップ)を表示する方法を紹介した。
サイズ・グリップはWindowsフォームが持つ標準機能だが、フォーム全体にコントロールがドッキングしているような場合、右下のサイズ・グリップが隠れてしまう。このような事態に対処するには、前掲のTIPSで紹介したようにStatusStripコントロールを利用する方法もあるが、このほかにフォーム上に被さっているコントロール内にサイズ・グリップを独自に描画する方法もある。本TIPSではこの方法を紹介する。
●独自にサイズ・グリップを描画する方法
独自にサイズ・グリップを描画するには、コントロールの描画時に発生するPaintイベントで、VisualStyleRendererクラス(System.Windows.Forms.VisualStyles名前空間)のインスタンス・メソッドであるDrawBackgroundメソッドを呼び出せばよい。その構文は下記のようになっている。
DrawBackgroundメソッド
- 第1パラメータ(IDeviceContext):描画に使用するIDeviceContextインターフェイス(System.Drawing名前空間)を実装したクラスのオブジェクト。通常は、Graphicsクラス(System.Drawing名前空間)のオブジェクトを指定する。
- 第2パラメータ(Rectangle):描画対象の領域(左上隅のx座標、y座標、幅、高さ)。
- 戻り値(void):なし。
VisualStyleRendererクラスをインスタンス化するには、下記の構文を持つコンストラクタを利用する。
VisualStyleRendererコンストラクタ
- 第1パラメータ(VisualStyleElement):描画に使用するビジュアル・スタイル要素。
※ビジュアル・スタイルとは、Windows XP以降のコントロールの外観のことである。詳しくは「TIPS:WindowsアプリケーションをWindows XPスタイルの外観にするには?」を参照してほしい。
今回の場合はサイズ・グリップであるため、この第1パラメータには「VisualStyleElement.Status.Gripper.Normal」プロパティの値を常に指定する。このプロパティから取得できる値は、VisualStyleElementクラス(System.Windows.Forms.VisualStyles名前空間)のオブジェクトである。なお、VisualStyleElement.Status.Gripperクラスも、System.Windows.Forms.VisualStyles名前空間に所属するクラスである。
サイズ・グリップの描画には、基本的に上記のDrawBackgroundメソッドを利用すればよいが、ビジュアル・スタイルはWindows XP以降で導入されている機能であるため、OSがビジュアル・スタイルやサイズ・グリップ要素に対応していない場合にはInvalidOperationException例外やArgumentException例外が発生してしまう。これを回避するには、ビジュアル・スタイル要素の対応状況をチェックする必要がある。これを行うのが、次の静的プロパティと静的メソッドだ(下記のApplicationクラスはSystem.Windows.Forms名前空間に所属)。
機能:OSがビジュアル・スタイル機能に対応しており、現在のアプリケーションがビジュアル・スタイル機能を有効にしているか?
VisualStyleRenderer.IsSupportedプロパティ(static/Shared)
- 取得(Boolean):true=対応。false=非対応。
機能:指定されたビジュアル・スタイル要素がサポートされているか?
VisualStyleRenderer.IsElementDefinedメソッド(static/Shared)
- 第1パラメータ(VisualStyleElement):描画に使用するビジュアル・スタイル要素。
- 戻り値(Boolean):true=対応。false=非対応。
VisualStyleRenderer.IsElementDefinedメソッドの第1パラメータには、先ほどのVisualStyleRendererコンストラクタと同様に「VisualStyleElement.Status.Gripper.Normal」を指定すればよい。
これらの静的プロパティと静的メソッドがすべてtrueの場合は、上記のDrawBackgroundメソッドを利用できる。
それ以外の場合は、ControlPaintクラスの静的メソッドであるDrawSizeGripメソッドを呼び出せばよい。このメソッドはビジュアル・スタイルではないサイズ・グリップを描画するためのメソッドだ。その構文は下記のようになっている。
DrawSizeGripメソッド(static/Shared)
- 第1パラメータ(Graphics):描画に使用するGraphicsオブジェクト。
- 第2パラメータ(Color):サイズ・グリップの背景色として使用されるColorクラス(System.Drawing名前空間)のオブジェクト。
- 第3パラメータ(Rectangle):サイズ・グリップの領域(左上隅のx座標、y座標、幅、高さ)。
- 戻り値(void):なし。
以上の内容をすべて含む、Windowsフォームでの実装例を示す。例えばPanelコントロールの右下に16×16のサイズ・グリップを描画するコードは、下記のようになる。なおPaintイベント・ハンドラは、(Panelコントロールの派生クラスではなく)Windowsフォーム側で処理している。
|
||
| Windowsフォームで独自にサイズ・グリップを描画するコード(上:C#、下:VB) |
上記のコードで注意してほしいのが、PanelコントロールのResizeイベント・ハンドラで、PanelコントロールのInvalidateメソッドを呼び出し、コントロールの再描画を行っている点だ。これを行わない場合、Windowsフォームをリサイズしたときに、以前の描画が残存してしまう。詳しくは「TIPS:ウィンドウのリサイズ時に再描画を行うには?」を参照してほしい。![]()
| 利用可能バージョン:.NET Framework 2.0 利用可能バージョン:.NET Framework 3.0 利用可能バージョン:.NET Framework 3.5 カテゴリ:Windowsフォーム 処理対象:独自描画コントロール 使用ライブラリ:VisualStyleRendererクラス(System.Windows.Forms.VisualStyles名前空間) 使用ライブラリ:VisualStyleElementクラス(System.Windows.Forms.VisualStyles名前空間) 使用ライブラリ:IDeviceContextクラス(System.Drawing名前空間) 使用ライブラリ:Graphicsクラス(System.Drawing名前空間) 使用ライブラリ:Colorクラス(System.Drawing名前空間) 使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間) 関連TIPS:フォーム全体へのドッキング状態でサイズ変更つまみを表示するには? 関連TIPS:ウィンドウのリサイズ時に再描画を行うには? 関連TIPS:WindowsアプリケーションをWindows XPスタイルの外観にするには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


