建立位元影像菜單

來源:互聯網
上載者:User
建立位元影像菜單

在通常的程式中菜單總是以文本的方式存在,有時候顯得非常單調乏味。如果能夠在菜單中加入位元影像圖形,將會極大地增加使用者的使用興趣。本文介紹了如何使用位元影像製作菜單選項。

建立位元影像菜單

----建立位元影像菜單其實非常簡單,它需要用到WindowsAPI(API)的一些菜單函數和位元影像函數,你需要將這些函數的聲明包含在你的應用程式的標準模組中,具體的內容請參見範例程式。步驟如下:

  1. 使用函數GetSubMenu來提取子功能表項的控制代碼,並通過使用函數CreateCompatibleDC來建立一個相容的裝置環境描述表;

  2. 在一個迴圈過程中通過使用CreateCompatibleBitmap函數,SelectObject函數以及BitBlt函數來分別將針對各個功能表項目所載入的位元影像選入到相容裝置環境中;

  3. 通過ModifyMenu函數繪製真正的位元影像菜單選項;

  4. 使用DeleteDC函數來釋放裝置環境,以便其他的程式可以使用它們。

----提取位元影像可以有多種方法,在本範例程式中在表單上設定了四個圖形框控制項,使用它們載入4個預設的表徵圖來作為菜單選項位元影像的源檔案,當然你也可以使用其他的方法,例如使用LoadPicture函數來從磁碟裝載位元影像。

範例程式

  1. 在Visual Basic中開始一個新的工程,採用預設的方法建立Form1。

  2. 建立一個新的模組,採用預設的方法建立Module1.Bas。

  3. 將如下的聲明語句和常量添加到Module1.Bas模組中:


    Option Explicit
    Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
    Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long,
      ByVal nPos As Long) As Long
    Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long,
      ByVal nPos As Long) As Long
    Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA"
    (ByVal hMenu As Long,ByVal nPosition As Long, ByVal wFlags As Long,
      ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
    Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Declare Function CreateCompatibleBitmap Lib "gdi32"
    (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long,
    ByVal hObject As Long) As Long
    Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long,
    ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC
    As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    Public Const SRCCOPY = &HCC0020

    Public Const MF_BYPOSITION = &H400&
    Public Const MF_BITMAP = &H4&


    注意上面的聲明語句需要書寫在一行內。

  4. 在Form1上添加4個圖形框控制項,將它們的Name屬性設定為Picture1,將它們的Index屬性依次設定為0,1,2,3,將它們的AutoRedrew屬性設定為True,將它們的AutoResize屬性設定為Ture,以及將它們的Visable屬性設定為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).Width / Screen.TwipsPerPixelX
        nHeight = Picture1(nLoopCtr).Height / Screen.TwipsPerPixelY
        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, (Picture1(nLoopCtr).
                      hdc), 0, 0, SRCCOPY)
           
            lTempID = SelectObject(hTempDC, lTempID)
           
            mnuFaceSel(nLoopCtr).Caption = ""
           
            lResult = ModifyMenu(hMenuID, nLoopCtr, MF_BYPOSITION Or MF_BITMAP,
                      GetMenuItemID(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個臉譜表徵圖所形成的位元影像子功能表項,1所示。單擊“檔案”/“退出”菜單可退出應用程式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.