--アイコン付きメニュー???--



ここではアイコン付きメニュー???の作り方を説明します。???が付いているのは果たしてこれがアイコン付きメニューと言えるかどうか疑問だからです。実際表示するのはアイコンではなくBitmapなんです。しかも13×13っていうかなり変則的な大きさ & この方法だとポップアップメニューには対応できません。
まぁサンプル見ていただければ分かると思いますが、それっぽくは見えます。
しっかりとしたのがほしい方はオーナードローで頑張って下さい。
じゃぁ早速使用するAPIの宣言などから行きます。

'メニューのハンドルを取得する
Private Declare Function GetMenu Lib "USER32" (ByVal hWnd As Long) As Long

'サブメニューのハンドルを取得する
Private Declare Function GetSubMenu Lib "USER32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

'メニューのチェックマークをビットマップに変更する
Private Declare Function SetMenuItemBitmaps Lib "USER32" (ByVal hMenu As Long, _
                   ByVal
nPosition As Long, ByVal wFlags As Long, _
                   ByVal hBitmapUnchecked As Long, _
                   ByVal hBitmapChecked As Long) As Long

Private Const MF_BYPOSITION = &H400 'メニューの項目番号

まずSetMenuItemBitmapsの説明から。言葉より表のがすっきりするんで表にします。

hMenu メニューのhWnd
nPosition メニュー中の何番目か?(0から始まります)
wFlags 良く分かんないです(爆)取りあえずMF_BYPOSITIONを・・・
hBitmapUnchecked チェックしてないときのBitmap
hBitmapChecked チェック時のBitmap


手順を説明します。

まずGetMenuを使います。hWndには「メニュー名」.Parent.hWndを渡してやってください。

次に返ってきた値をGetSubMenuのhMenuに入れてやります。で、nPos。
nPosってゆうのは各メニューの位置です。IEなら、「ファイル」 「編集」 「表示」 「お気に入り」 ・・・ ってな感じになってますよね。だから「ファイル」を指定したいなら0、「編集」なら1としてあげます。

ラストSetMenuItemBitmaps。
hMenuにはGetSubMenuで返ってきた値を入れてあげます。nPositionも上のnPosと同じです。
「ファイル」「編集」それぞれの中で更にメニューがありますよね?
SetMenuItemBitmapsのnPositionは、この更にあるメニューの中でどれを指定するかってことです。

ん〜なんかメニューの指定の仕方が分かりにくそうですね。下の図みたいな感じになっています。


解りにくいところの説明はこれで終了。(かえって解りにくくなったって話も・・・)
こういうのは習うより慣れろです。下のコードを見て流れを掴んで下さい。宣言などは抜かします。

'メニューのチェックマークをビットマップに変更する。
Private Function
SetBMP(hWnd As Long, MenuPos As Long, InMenuPos As Long, BMP As Long) As Long
'hWnd     メニューの親のhWnd
'MenuPos  メニューの位置
'InMenuPos メニュー中の位置
'BMP     SetしたいBitmap(型はLongだけど普通にPictureで渡してOKです)


Dim MenuhWnd As Long
Dim SubMenuhWnd As Long

MenuhWnd = GetMenu(hWnd)
SubMenuhWnd = GetSubMenu(MenuhWnd, MenuPos)

SetBMP = SetMenuItemBitmaps(SubMenuhWnd, InMenuPos, MF_BYPOSITION, BMP, BMP)


実際にどう使ってんだー!!という人のためにサンプルを用意しました。
あと、このコードだと階層を作ってるメニューには対応していません。
*サンプルの方では対応しました。
こんなん↓


ただ、ポップアップメニューに対応できないため実用性は低い気が・・・

サンプルをダウンロード

-Back-