首页 / 软件开发 / 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 减下 = 2MenuId = 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,右方仍是字串呢,使用以下的APISetMenuItemBitmaps(
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 = GetMenuCheckMarkDimensionswd5 = i Mod 2 ^ 16 "宽hi5 = i / 2 ^ 16 "高而我们Load进来的图之宽 Me.ScaleX(pic2.Width, vbHimetric, vbPixels)高 Me.ScaleY(pic2.Height, vbHimetric, vbPixels)