Welcome

首页 / 软件开发 / VB / 有BitMap之Menu

有BitMap之Menu2010-01-02在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)