.NET特集
 N1.Web関連
 Q1.VS2005自作Visualizer
 R1.OpenCV

VB6特集
 S1.Net関連(95/98)
 S2.Net関連(NT)
 S3.コモンダイアログの拡張
 S4.MailSlot関連
 S5.RAS関連
 S6.セキュリティ関連
 S7.FAX制御(Win2000)
 S8.ADSIの利用
 T1.グラデーションバー
 T2.アイコンメニュー
 T3.バーコード(NW7)
 アイコンメニュー
この、アイコンメニュークラスは、今まで VB では実現が難しかった、メニューにアイコンを表示する機能を提供します。 大きな特徴としては、VB 標準のメニューエディタで作成したメニューをそのまま使用しますので、 既存のプロジェクトにアイコンメニュークラスを追加するだけで、簡単にメニューにアイコンを表示することができます。 (表示するアイコンは、イメージリストコントロールを使用)また、メニューとアイコン(イメージリスト)の関連付けは、 なるべくコードを記述しなくてもよいよう配慮しています。(この配慮が今後の改善の課題になりそう...)
 どうやっているの?
「オーナードロー」こんな言葉を聞いた事はないですか?オーナードロー、すなわち「自分で描画する」という事です。 通常は、Windows が勝手に描画してくれていたのを、自分で外観(サイズ、位置、色...など)を描画する事です。 VB で作成したメニューは、Windows が勝手に制御を行ってくれるのですが、本クラスでは、このメニューを、オーナードローに設定し、 描画する事により、メニューにアイコンを表示する機能を実現しています。オーナードローについては、今後取り上げて説明したいと思います。
 注意事項
本クラスは、サブクラス化を行っていますので、開発時には、「中断」をしないようにして下さい。 また、AddressOf演算子を使用していますので、VB5.0 以降でしか動作しません。
 プロパティ一覧
プロパティ 説明 取得 設定
hTargetWnd 対象となるメニューを持つウインドウハンドルを指定します。
hMenu 対象メニューハンドルを取得します。  
IconWidth IconWidth=60の例
アイコンを表示する領域の幅
デフォルトでは、MenuDefaultImageで設定されたイメージリストのアイコンの幅になります。
アイコンの幅より小さい値にはできません。
IconHeight IconWidth=32,IconHeight=32の例
アイコンを表示する領域の高さ
デフォルトでは、MenuDefaultImageで設定されたイメージリストのアイコンの高さになります。
アイコンの高さより小さい値にはできません。
Style アイコンメニューの表示スタイル
 IcNormal:ノーマルスタイル(デフォルト)
 IcVb:VBエディタスタイル
 IcCool:クールスタイル
IconMenuItems cIconMenu クラス中の IconMenuItem オブジェクトのコレクションへの参照を返します。
詳しくは、下の「IconMenuItemオブジェクト」を参照して下さい。
   
 IconMenuItemオブジェクト、IconMenuItemsコレクション
・IconMenuItem オブジェクトは、ID、メニュー文字列、フォントなどの情報によって構成されています。
・IconMenuItems コレクションは、IconMenuItem オブジェクトで構成されています。
プロパティ 説明 取得 設定
Key アイテムキー
通常、初期設定時のメニューのキャプションになります。
このキーを元に、アイテムを識別するので、変更しないで下さい。 通常使用しません。
Index アイテムインデックス
通常使用しません。
hMenu アイテムのメニューハンドル
通常使用しません。
Caption メニュー文字列
ShortCut メニューショートカット文字列
FontBold フォント太字
FontItalic フォントイタリック
FontUnderline フォントアンダーライン
 メソッド一覧
メソッド 説明
SetIconMenu メニューをアイコンメニューに設定します。
必ず、hTargetWnd、MenuDefaultImage 各プロパティを設定してから呼出して下さい。
UnSetIconMenu 設定されたアイコンメニューを解除します。
終了する場合には、必ず呼出す必要があります。(サブクラス化を行っている為)
GetIDtoKey アイテム ID よりアイテムキーを取得します。
通常使用しません。
GetImageIndex アイテムキーよりイメージリストインデックスを取得します。
通常使用しません。
 アイコンメニュー機能を実装しよう
■cClsIconMenuクラスの定義は標準モジュールで行う
なぜかというと、サブクラス化を行っている為、処理を行うウインドウプロシージャからも参照する為です。

■各メニュー項目とアイコンの関連付け
一番重要ななのはここです。フォームのメニューが適切に設定されていて、 フォームにイメージリスト(ImageList1)が配置されているとしたら、通常、 アイコンメニュークラスを使用する場合、最低限のコードは、

[標準モジュール]
Public ClsIconMenu As New cIconMenu

[フォームモジュール]
Private Sub Form_Load()
    'アイコンメニュークラス初期設定
    With ClsIconMenu
        .hTargetWnd = Me.hwnd
        .MenuDefaultImage = ImageList1
        'アイコンメニューに設定
        .SetIconMenu
  End With
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    'アイコンメニューを解除
    ClsIconMenu.UnSetIconMenu
End Sub
のようになります。たったこれだけです。(^-^)
どうやって各メニュー項目とイメージリストのアイコンを関連付けているのでしょうか? それは、なるべくコードを記述しなくてもよいように
メニューのキャプションとイメージリストのキーを関連付けています。

関連付け 右の画面をご覧ください。上は、イメージリストのプロパティページ、下はメニューエディタです。
メニュー項目にイメージリストのアイコンを関連付けるには、関連付けたいメニューのキャプションと、 イメージリストのキープロパティを同じ文字列にすれば、関連付けられます。
なんか無理矢理という感じですが、なるべく簡単に関連付けを行う事を考慮した結果、私の脳みそはこんな方法しか 思い浮かびませんでした...^^;
しかし、関連付けをこのように簡単にした分、デメリットとして、アイコンメニューに設定した後にアイコンを変更 したい場合には、イメージリストの方を制御しなくてはなりません。 (まあ、メニューの場合あまりアイコンを変更する事はないですが...)
これらは、今後改善する余地が多いにあります。
これでアイコンの関連付けの方法は、だいたい理解できたと思います。

■既存メニューのプロパティとイベント
既存メニューのプロパティ、イベントは、そのまま今まで通り使用します。ポップアップメニューの表示なども、現行のままで OK です。
だだし、キャプション(Caption)プロパティについては、上でも述べたように、アイコンとの関連付けに使用していますので、 IconMenuItemオブジェクトの Caption プロパティを変更するようにして下さい。
現時点では、初期設定時のメニューキャプションより長い文字列を指定した場合、 正常に文字列が表示されません。 この現象は、アイコンメニューに設定(SetIconMenu メソッド)時にしか、メニューのサイズを計算していない為です。
有効 Enabled = False
チェック Checked = True
メニューのプロパティを設定すると、表示はこのようになります。

■IconMenuItemオブジェクト、IconMenuItemsコレクションの使用方法
アイコンメニュークラスを使用する事により、行える処理にフォントの拡張があります。 これらの設定を行うのに、IconMenuItemオブジェクト、IconMenuItemsコレクションを使用しますので、 以下に例を挙げて説明します。説明にあたって、アイコンメニュークラスが、ClsIconMenu、 メニュー項目が Name=mnuFile_Open、Caption=開く(&O) に設定されているとします。
太字にする
太字 ClsIconMenu.IconMenuItems(mnuFile_Open.Caption).FontBold = True
イタリックにする
イタリック ClsIconMenu.IconMenuItems(mnuFile_Open.Caption).FontItalic = True
下線を付ける
下線 ClsIconMenu.IconMenuItems(mnuFile_Open.Caption).FontUnderline = True
キャプションを変更する
 ClsIconMenu.IconMenuItems(mnuFile_Open.Caption).Caption = "新しいキャプション"
このようになります。この事から、IconMenuItemオブジェクトのキーが、メニューとアイコンの関連付け同様に、メニューのキャプションを 使用しているのが分かりますね?

 サンプル
サンプルダウンロード(19KB)

Copyright © 2005 tadahiro higuchi. All Rights Reserved.