在通常的程序中,菜單總是以文本方式存在,顯得非常單調乏味。 如果能夠在菜單中加入位圖圖形,將會極大地增加用戶的使用興趣。 本文介紹如何使用位圖制作菜單選項。
創建位圖菜單
創建位圖菜單其實非常簡單,需要用到Windows應用程序編程接口 (API)的一些菜單函數和位圖函數,將這些函數的聲明包含在應用程序 的標准模塊中,具體的內容請參見樣例程序。步驟如下:
1.使用函數GetSubMenu來提取子菜單項的句柄,並通過使用函數C reateCompatibleD C來創建一個兼容的設備環境描述表;
2.在一個循環過程中通過使用CreateCompatibleBitmap函數、Se lectObject函數以及BitBlt函數來分別將各個菜單項所載入的位圖選 入到兼容設備環境中;
3.通過ModifyMenu函數繪制真正的位圖菜單選項;
4.使用DeleteDC函數來釋放設備環境,以便其他的程序可以使用 它們。
提取位圖可以有多種方法,在本樣例程序中在窗體上設置了四個 圖形框控件,使用它們載入4個預設的圖標來作為菜單選項位圖的源文 件。當然也可以使用其他的方法,例如使用LoadPicture函數來從磁盤 裝載位圖。
樣例程序
1. 在Visual Basic中開始一個新項目工程(project),用缺省的 方法建立Form1。
2. 創建一個新的模塊,采用缺省的方法建立Module1.Bas。
3. 將如下聲明語句和常量添加到Module1.Bas模塊中:
Option Explicit Declare Function GetMenu Lib "user32" (ByVal hwnd As Lon g) As Long Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPo s As Long) As Long Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByValn Pos As Long) As Long Declare Function ModifyMenu Lib "user32" Alias "ModifyMe nuA" (ByVal hMen u As Long, ByVal nPosition As Long, ByVal w Flags As Long, ByVal wIDNewItemAs Long, ByVal lpString As An y) As Long Declare Function CreateCompatibleDC Lib "gdi32" (ByVal h dc As Long) AsLo ng Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long ) As Long Declare Function CreateCompatibleBitmap Lib "gdi32" (ByV al hdc As Long,B yVal nWidth As Long, ByVal nHeight As Long) As Long Declare Function S ctObject Lib "gdi32"(ByVal hdc As L ong, ByVal hObje ct As Long) As Long Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Lo ng, ByVal x AsLo ng, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrc DC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) AsL ong Public Const SRCCOPY = &HCC0020 Public Const MF_BYPOSITION = &H400& Public Const MF_BITMAP = &H4&
注意:上面的聲明語句需要書寫在一行內。
4. 在Form1上添加4個圖形框控件,Name屬性設置為Picture1,Ind ex屬性依次設
置為0、1、2、 3,AutoRedrew屬性設置為True,AutoResize屬性 設置為Ture,Visabl e屬性設置為False。
5. 將上面的4個圖形框控件的Picture屬性依次設置為Face1.ico 、Face2.ico、
Face3.ico、Face4.ico。
6. 在Form1上添加第一個菜單項,將它的標題設置為"[&F]文件", 名稱設置
為mnuFile。在其下添加一個子菜單項,將它的標題設置為"[&E] 退出",名稱設置為mnuExit。
7. 在Form1上添加第二個菜單項,將它的標題設置為"[&A]臉譜", 名稱設置
為mnuFace。在其下添加4個子菜單項,分別將改4個子菜單項的名 稱設置為"[N]正常"、"[&S]微笑"、" [&L]大笑"、以及"[&O]悲傷"。 將它們的名稱設置為"mnuFaceSel",並相應將這4個子菜單項的索引設 置為0、1、2、3。
8.將如下代碼添加到Form1的Form_Load事件中:
Private Sub Form_Load() Dim nLoopCtr As Integer Dim lResult As Long Dim hTempDC As Long Dim nWidth As Integer Dim nHeight As Integer Dim lTempID As Long Dim hMenuID As Long Dim lItemCount As Long Dim hBitmap As Long nWidth = Picture1(nLoopCtr).WidthScreen.TwipsPerPixelX nHeight = Picture1(nLoopCtr).HeightScreen.TwipsPerPixel Y hMenuID = GetSubMenu(GetMenu((Me.hwnd)), 1) hTempDC = CreateCompatibleDC(Picture1(nLoopCtr).hdc) For nLoopCtr = 0 To 3 hBitmap = CreateCompatibleBitmap(Picture1(nLoopCtr).hdc, nWidth, nHeight lTempID = SelectObject(hTempDC, hBitmap) lResult = BitBlt(hTempDC, 0, 0, nWidth, nHeight, (Pictur e1(nLoopCtr).hdc ), 0, 0, SRCCOPY) lTempID = SelectObject(hTempDC, lTempID) mnuFaceSel(nLoopCtr).Caption = "" lResult = ModifyMenu(hMenuID, nLoopCtr, MF_BYPOSITION Or MF_BITMAP, GetM enuItemID(hMenuID, nLoopCtr), hBitmap) Next nLoopCtr lResult = DeleteDC(hTempDC) End Sub
9.將如下的代碼添加到"退出"子菜單的單擊事件中:
Private Sub mnuExit_Click(Index As Integer) Select Case Index Case 0 Unload Me End Select End Sub
運行該樣例程序,單擊"臉譜"菜單,則會看到由4個臉譜圖標所形 成的位圖子菜單項,;單擊"文件""退出"菜單可退出應用程序。