.NETプログラミング研究 第5号 †注意事項 †今回はコードが長いため、VB.NETのコードのみを紹介します。ご了承ください。C#のコードについては、私のサイトで紹介するかもしれません。 ピンポイントリンク †メニューにアイコンを表示する2 †前回メニュにアイコンを表示する方法についてその基礎を説明しましたが、結局いくつかの問題が残ってしまいました。今回は前回作成したImageMenuItemクラスをより使えるものに改善させます。 前回のImageMenuItemクラスの欠点として主に次の2点が挙げられます。
まず1番目の問題ですが、これには文字列を立体的に灰色表示する方法と、画像を立体的に灰色表示する方法の2つのテクニックが必要になります。 多分これが一般的なのではないかと思いますが、まずはAPIを使う方法を紹介します。Win32 APIのDrawState関数を使うことにより、無効状態の文字列や画像を描画できます。以下にDrawState関数を使った簡単な使用例を示します。 (下記コード内のDrawStateString関数で描画した文字列の位置は、同じ位置にGraphics.DrawStringメソッドで描画した文字列の位置よりわずかに左側にずれてしまいます。DrawState関数を使うのであれば、すべてにおいてDrawState関数を使って描画すべきかもしれません。)
APIを使わずに同じことができないものか調べたところ、それらしいメソッドを見つけました。それは、ControlPaintクラスのDrawImageDisabledメソッドとDrawStringDisabledメソッドです。いかにも「ビンゴ!」という感じの名前をしています。次にこれらのメソッドの使用例を示します。
これで期待通りの結果が得られるかといいますと、そううまくは行きません。ControlPaint.DrawImageDisabledメソッドで描画された画像は立体的ではなく、平面的な画像で描画されます。ControlPaint.DrawStringDisabledメソッドで描画された文字列は立体的にはなりますが、よく見ると文字の色がちょっとだけ違います。(ControlPaint.DrawStringDisabledメソッドの4番目のパラメータ「文字列を描画するためのColor」にどの値を入れても同じにならないようです。) こうなったら自分でなんとかすることにしましょう。無効状態の文字列は影を縦横に1ドットずらして描画すればいいだけなので、簡単です。 問題は画像の方です。ここでは確実に、元の画像を1ドットずつ調べて、新しく無効状態の画像を作成する方法を考えます。次にその例を示します。 (ここでは白のみを透明にしていますが、これには何の根拠もありません。 bmp.GetPixel(x, y).GetBrightness < 1.0F の1.0Fを別の値にしたほうがいいのかもしれません。どの値が適当なのかご存知の方がいらっしゃいましたら、ぜひ教えてください。)
次に2番目の問題に移りたいところですが、予想以上に長くなってしまいましたので、今回はこの辺で終わりにさせていただき、続きはまた次回とさせて頂きます。次回こそは完成させたいですね。 コメント †
|