.NET TIPS 文字列や画像を無効状態で描画するには?デジタルアドバンテージ 一色 政彦2005/05/27 |
|
|
「TIPS:画像を高品質に拡大/縮小するには?」でも示されているように、文字列や画像を描画するには、それぞれGraphicsクラス(System.Drawing名前空間)の次のメソッドを利用すればよい。
- 文字列の描画:Graphics.DrawStringメソッド
- 画像の描画:Graphics.DrawImageメソッド
これはWindowsフォームのユーザー・コントロールやカスタム・コントロールでも(一般的な.NET開発では)同じで、これらのコントロール上に文字列や画像を描画する際にはDrawStringメソッドやDrawImageメソッドを用いればよい。
ただし、コントロールを無効化している場合(EnabledプロパティをFalseに設定する)には注意が必要となる。本稿では、無効化されたコントロールに文字列や画像を正しく描画するための方法を紹介する。
無効状態に見えないコントロール
Windows OSの一般的なユーザー・インターフェイスでは、無効化されたコントロールに描画されている文字列や画像はグレー・アウトした状態(=グレー色)で表示される。
しかしDrawStringメソッドやDrawImageメソッドで独自の描画を加えた場合、これらはコントロールのEnabledプロパティをFalseに変更しただけでは、グレー・アウトした状態で表示されるような仕様にはなっていない。そのため、(単にこれらのメソッドを使って描画しただけでは)そのコントロールは無効状態に見えないのだ。
次の画面は、実際にはフォーム上のすべてのコントロールが無効化されているにもかかわらず、そのようには見えない例である。
独自に描画を行ったために無効状態に見えないコントロールの例 | |||||||||
フォームを無効化する(EnabledプロパティをFalseに設定する)ことで、フォーム上のすべてのコントロールを無効化したところ。だが、一部のコントロール(と)は無効化されているようには見えない。 | |||||||||
|
この画面例を見ると分かるように、フォーム上のすべてのコントロールが無効化されているにもかかわらず、DrawStringメソッドやDrawImageメソッドを使って描画を行っているコントロール(この例では、PanelコントロールとPictureBoxコントロール)だけが、グレー・アウトした状態で表示されていない。そのため、コントロールを見ただけでは無効になっているかどうかを判別できない。これではやはりユーザビリティの面で問題となるだろう。
無効状態での文字列と画像の描画
文字列や画像を無効状態で(つまりグレー色で)描画するためには、それぞれControlPaintクラス(System.Windows.Forms名前空間)の次のメソッドを使えばよい(いずれも静的メソッドなので、直接呼び出せる)。
- 無効化された文字列の描画:ControlPaint.DrawStringDisabledメソッド
- 無効化された画像の描画:ControlPaint.DrawImageDisabledメソッド
コントロールが無効化されている場合には、先ほどのDrawStringメソッドやDrawImageメソッドの代わりに、このDrawStringDisabledメソッドやDrawImageDisabledメソッドを用いればよいわけである。
次のコードは、コントロールのEnabledプロパティがFalseの場合に、DrawStringDisabledメソッドやDrawImageDisabledメソッドを用いて文字列や画像を描画する例である。なお、コントロールへの文字列や画像の描画は、そのコントロールのPaintイベント・ハンドラで行うことができる。
|
|
無効状態の文字列や画像を描画するサンプル・コード(C#) |
|
|
無効状態の文字列や画像を描画するサンプル・コード(VB.NET) | |
DrawStringメソッドやDrawStringDisabledメソッドのパラメータで使われているRectangleF.op_Implicitメソッドは、Rectangle構造体のオブジェクトをRectangleF構造体のオブジェクトに型変換するためのものだ。詳しくはMSDNの「Rectangle から RectangleF への変換」を参照してほしい。なお、C#のコードにはあるDrawStringDisabledメソッドやDrawImageDisabledメソッドのパラメータ内容についてのコメントは、このVB.NETのコードでは割愛している。これは、VB.NETのコード規約ではアンダーバーによる行継続とコメントを併記できないためである。従って、パラメータ内容はC#のコードを参照すること。 |
このサンプル・コードの内容を冒頭のWindowsフォームのプログラムに追加して実行したものが、次の画面である。
独自に描画を行っても正しく無効状態に見えるコントロールの例 | ||||||
フォームを無効化する(EnabledプロパティをFalseに設定する)ことで、フォーム上のすべてのコントロールを無効化したところ。すべてのコントロールが無効化されているのが、見ただけですぐに分かる。 | ||||||
|
なお、ControlPaint.DrawImageDisabledメソッドの第5パラメータにある背景色の指定は実際の描画色として適用されてないようだ(これは恐らく、.NET Frameworkのバグであろう)。このため、いくら背景色を変更しても、常にこの画面例と同じ色でしか描画されないので注意してほしい。
カテゴリ:クラス・ライブラリ 処理対象:ビットマップ カテゴリ:Windowsフォーム 処理対象:ウィンドウ カテゴリ:Windowsフォーム 処理対象:コントロール 使用ライブラリ:Graphicsクラス(System.Drawing名前空間) 使用ライブラリ:ControlPaintクラス(System.Windows.Forms名前空間) 関連TIPS:画像を高品質に拡大/縮小するには? |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|