在Window API中,有一些名词要先清楚,假设有一功能表如下:
档案 编辑 选项 --> hMenu (功能表)
+-------+
|复制 |---------> hSubMenu (子功能表)
|贴上 |
|减下 -------------> MenuID (功能表项目)
| |
+-------+
如果,我们使用vb的功能表编辑器做出上面的Menu,那 hMenu的取得使用GetMenu() API,而hSubMenu 的取得是 GetSubMenu,而GetSubMenu()的第二个叁数指的是功能表的第几个子功能表,以上例来说,编辑子功能表是第1个子功能表(以0为基准),所以编辑子功能表的取得应用以下的呼叫 :
hMenu = GetMenu(Me.hwnd)
hSubMenu = GetSubMenu(hMenu, 1) '取得编辑子功能表的hSubMenu
而功能表项目则由以下的呼叫取得,第二叁数指的是该子功能表的第几个项目(以0开始),故复制 功能表项目 = 0 减下 = 2
MenuId = GetMenuItemID(hSubMenu, 0) '取得复制 的hMenuId接着便是以ModifyMenu来更动MenuId成BitMap的方式Set Pic1 = LoadPicture("E:\cli.bmp")ModifyMenu hSubMenu, 0, MF_BITMAP Or MF_BYPOSITION, MenuId, pic1.HandleModifyMenu 第二个叁数 表示更动hSubMenu所指的子功能表中第几个功能表项目
第三个叁数 MF_BITMAP 表示用BitMap的方式显示
MF_STRING 表示用字串方式显示
MF_BYPOSITION 表示第二个叁数的值代表是依位置来算
第四个叁数 MenuId
第五个叁数 显示图的hBitMap
另外,如何做到MenuItem的左方有一小Bitmap,右方仍是字串呢,使用以下的API
SetMenuItemBitmaps(
hSubMenu as Long , // handle of 子功能表
uItem as Long , // 更动第几个Menu Item
fuFlags as Long, // menu item flags
hbmUnchecked as Long, // handle of unchecked bitmap
hbmChecked as Long // handle of checked bitmap
)
Set Pic2 = LoadPicture("e:\cli2.BitMap")
Call SetMenuItemBitmaps(hSubMenu, 1, MF_BYPOSITION,pic2.Handle, Pic2.Handle)
这里有一个地方要特别注意,到底hbmUnchecked/hbmchecked 所指的BitMap图有多大呢,
如果pic2所放入的BitMap太大,那不会出现我们想要的图,那得自己想办法缩图;而使
用以下的API可以取得Menu Item左边Bitmap图的大小(By Pixels)
i = GetMenuCheckMarkDimensions
wd5 = i Mod 2 ^ 16 '宽
hi5 = i / 2 ^ 16 '高
而我们Load进来的图之宽 Me.ScaleX(pic2.Width, vbHimetric, vbPixels)
高 Me.ScaleY(pic2.Height, vbHimetric, vbPixels)