┏弟6号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■.NET Tips ・メニューにアイコンを表示する3 完結編 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●メニューにアイコンを表示する3 完結編 またまた前回の続きです。今回でようやく本当に完結します。 さて、残る問題は 2.チェックが付いているとき(CheckedがTrueのとき)の処理 だけとなっていました。早速解決法を考えてみましょう。 メニューのチェックマークを描画するには通常APIの DrawFrameControl関数を使用します。以下にその例を示します。ちな みに「排他的チェックマーク」というのは「オプションボタン」(丸 いチェックマーク)のことです。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'API宣言部分 Private Declare Function DrawFrameControl Lib "user32" _ Alias "DrawFrameControl" (ByVal hDC As IntPtr, _ ByRef lpRect As RECT, _ ByVal un1 As Integer, _ ByVal un2 As Integer) As Integer _ Private Structure RECT Public Left As Integer Public Top As Integer Public Right As Integer Public Bottom As Integer End Structure Private Const DFC_MENU = 2 Private Const DFCS_MENUBULLET = &H2 Private Const DFCS_MENUCHECK = &H1 '---------- '以下、描画のためのコード '表示位置 Dim r1 As RECT r1.Left = 0 r1.Right = 16 r1.Top = 0 r1.Bottom = 16 Dim r2 As RECT r2.Left = 0 r2.Right = 16 r2.Top = 50 r2.Bottom = 66 Dim hdc As IntPtr = e.Graphics.GetHdc() 'メニューのチェックマークの描画 DrawFrameControl(hdc, r1, DFC_MENU, DFCS_MENUCHECK) 'メニューの排他的チェックマークの描画 DrawFrameControl(hdc, r2, DFC_MENU, DFCS_MENUBULLET) e.Graphics.ReleaseHdc(hdc) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ところが全く同じことが.NET FrameworkのControlPaint. DrawMenuGlyphメソッドでできるのです。わざわざAPIを使う必要はあ りませんでした(じゃあ書くなって話ですが...)。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'メニューのチェックマークの描画 ControlPaint.DrawMenuGlyph(g, 0, 0, 16, 16, MenuGlyph.Checkmark) 'メニューの排他的チェックマークの描画 ControlPaint.DrawMenuGlyph(g, 0, 50, 16, 16, MenuGlyph.Bullet) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ しかしこの方法で描画されたマークは必ず白黒になるようで、マーク は黒く、背景色は白くなります。よって適当な色のマークを適当な背 景色で描画するには、色を変換して描画する必要があります。これは ImageAttributes.SetRemapTableメソッドを使用すればできます。 次の例では新しく作成した16x16のBitmapオブジェクトにチェックマー クを描画し、そのBitmapを黒がSystemColors.MenuTextに白がColor. TransparentになるようにしてGraphicsオブジェクトgに描画していま す。ちょっと面倒ですが、この方法を使えば任意の色と背景色でチェ ックマークを描画することができます。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ '新しいBitmapオブジェクトの作成 Dim bmp As New Bitmap(16, 16) '作成したBitmapオブジェクトにチェックマークを描画 ControlPaint.DrawMenuGlyph(Graphics.FromImage(bmp), _ 0, 0, 16, 16, MenuGlyph.Checkmark) '色を入れ替えるための準備 Dim cms() As ColorMap = _ New ColorMap() {New ColorMap(), New ColorMap()} '入れ替える色を指定する cms(0).OldColor = Color.Black cms(0).NewColor = SystemColors.MenuText cms(1).OldColor = Color.White cms(1).NewColor = Color.Transparent 'ImageAttributesオブジェクトの作成 Dim imageAttr As New ImageAttributes() imageAttr.SetRemapTable(cms) 'ImageAttributesを指定して描画 g.DrawImage(bmp, New Rectangle(0, 0, bmp.Width, bmp.Height), _ 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, _ imageAttr) '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ さて、これでようやく必要な技術がそろいました。今まで紹介したテ クニックを使って前のImageMenuItemクラスを書き換えましょう。ここ でそのコードを紹介したいところですが、あまりに長くなってしまう ため、下記URLで紹介させていただきますので、こちらをご覧ください。 ・ImageMenuItem Class http://dobon.net/vb/samples/imagemenuitem/ 苦労の末、せっかく出来上がったImageMenuItemクラスですが、よくみ るアイコンメニューとはかなり違います。一般的なアイコンメニュー はOffice97タイプのもので、メニュー項目が選択されるとアイコンが 出っ張ったようになり、チェックが付くと引っ込んだようになります。 今後ImageMenuItemクラスもそうできるようにする予定ですが、そろそ ろ飽きてきたので、今回で一応完結とされていただきます。 =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  http://dobon.net  dobon@bigfoot.com ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/bbs ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 DOBON! All rights reserved. ===============================