建立點陣圖選單 (轉)

worldblog發表於2007-12-04
建立點陣圖選單 (轉)[@more@]建立點陣圖選單

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

建立點陣圖選單

----建立點陣圖選單其實非常簡單,它需要用到應用程式介面()的一些選單和點陣圖函式,你需要將這些函式的宣告包含在你的應用程式的標準模組中,具體的內容請參見樣例程式。步驟如下:

  1. 使用函式GetSubMenu來提取子選單項的控制程式碼,並透過使用函式CreateCompatibleDC來建立一個相容的裝置環境描述表;

  2. 在一個迴圈過程中透過使用CreateCompatibleBitmap函式,函式以及BitBlt函式來分別將針對各個選單項所載入的點陣圖選入到相容裝置環境中;

  3. 透過ModifyMenu函式繪製真正的點陣圖選單選項;

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

----提取點陣圖可以有多種方法,在本樣例程式中在窗體上設定了四個圖形框,使用它們載入4個預設的圖示來作為選單選項點陣圖的源,當然你也可以使用其他的方法,例如使用LoadPicture函式來從裝載點陣圖。

樣例程式

  1. 在中開始一個新的工程,採用預設的方法建立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 nPAs 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 nLCtr 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所示。單擊“檔案”“退出”選單可退出應用程式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988033/,如需轉載,請註明出處,否則將追究法律責任。

相關文章