順序對齊菜單完成方法
發(fā)表時間:2023-08-02 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:丁健 張萬軍 江南 右順序對齊菜單就是菜單在菜單條的最右側對齊,往左排列。平時,我們能看到很多右順序對齊菜單的例子,如“WPS2000集成辦公系統(tǒng)”有文件打開時的“定制界面”菜單、Origin...
作者:丁健 張萬軍 江南
右順序對齊菜單就是菜單在菜單條的最右側對齊,往左排列。平時,我們能看到很多右順序對齊菜單的例子,如“WPS2000集成辦公系統(tǒng)”有文件打開時的“定制界面”菜單、Origin2.5的“Help”菜單等。將右順序對齊菜單應用于應用程序中,可以打破常規(guī)菜單左順序對齊的顯示方式,給人耳目一新的感覺;另外,我們可以將一些需要實時更新的消息、提示等顯示在右順序對齊菜單中,醒目突出,既符合人體肉眼查詢信息的習慣,又可避免占用窗體或狀態(tài)欄空間。因此,右順序對齊菜單具有一定的實用性。
Visual C++環(huán)境下的實現(xiàn)方法
Visual C++的編程環(huán)境支持可視化的菜單設計,在設計菜單時可直接將菜單指定為“右順序對齊菜單”。具體方法是:選定菜單后雙擊或在右鍵菜單中選“屬性”,打開菜單屬性對話框,選“Extended Styles”標簽,在“Extended Styles”標簽板上只有“右-左順序對齊”項,選擇“右-左順序對齊”項即可。注意,上述指定只對菜單條上的菜單有效,對子菜單項也可指定但運行時沒有效果。圖1為經過Visual C++編譯后的右順序對齊菜單應用程序運行時的顯示效果。
圖1 VC環(huán)境下右順序對齊菜單應用程序
Visual Basic環(huán)境下的實現(xiàn)方法
Visual Basic環(huán)境不支持直接指定、創(chuàng)建右順序對齊菜單,必須通過編程實現(xiàn)。根據MSDN對菜單信息數據結構、相關API函數的解釋,可概括出實現(xiàn)這項功能的四個步驟或稱具體程序流程:
1.定義菜單信息數據結構MenuItemInfo全局對象;
2.用GetMenuItemInfo API函數取得指定的菜單信息,并將信息存放于定義的MenuItemInfo對象內;
3.將定義的MenuItemInfo全局對象的fType部分設為MFT_RIGHTJUSTIFY(設置右順序對齊菜單的關鍵參數);
4. 用SetMenuItemInfo API函數重新設置菜單。
MenuItemInfo的定義
MenuItemInfo存放菜單特征信息如: 類型、狀態(tài)、標識號、句柄指針值等,這些特征信息決定了菜單的標題內容、排列順序、響應方式等等。適當改變其中某些信息即可實現(xiàn)菜單右順序對齊。
MenuItemInfo的定義如下:
typedef struct tagMENUITEMINFO {
UINT cbSize;
UINT fMask;
UINT fType;
UINT fState;
UINT wID;
HMENU hSubMenu;
HBITMAP hbmpChecked;
HBITMAP hbmpUnchecked;
DWORD dwItemData;
LPTSTR dwTypeData;
UINT cch;
} MENUITEMINFO,F(xiàn)AR *
LPMENUITEMINFO。
MenuItemInfo結構中與右順序對齊菜單實現(xiàn)密切相關的是fType參數,fType存放菜單項的類型參數,它可以是預定義值中的一個或幾個。
其中的MFT_RIGHTJUSTIFY常數可將本菜單項及其隨后的菜單調整到菜單條的右側排列。
API函數GetMenuItemInfo、SetMenuItemInfo簡介
GetMenuItemInfo函數簡介:
函數功能:取得一個菜單項的信息。
函數原型:BOOL GetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition, LPMENUITEMINFO Ipmii)。
參數:
hMenu:包含指定菜單項的菜單的句柄。
uItem: 將要取得其信息的菜單項的標識符或位置,此參數的含義取決于參數fByPosition的值。
fByPosition: 此值用于指定參數uItem的含義,如果此參數是FALSE,則uItem表示菜單項的標識符; 否則,表示菜單項的位置。
Ipmii:指向結構MenuItemInfo的指針,該結構指定要取得的信息并接收菜單項的信息。
返回值:如果函數調用成功,返回非零值;如果函數調用失敗,返回值是零。
調用注意點:Windows CE環(huán)境下,由參數Ipmii指向的MenuItemInfo結構中的fMask不能取MIM_CHECKMARKS。
SetMenuItemInfo函數簡介:
函數功能:該函數改動一個菜單項的信息。
函數原型:BOOL SetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition, LPMENUITEMINFO Ipmii)。
參數:
hMenu: 包含菜單項的菜單的句柄。
uItem: 將被修改的菜單項的標識或位置,此參數的含義由參數fByPosition確定。
fByPosition: 此值用于指定uItem的含義。如果此參數值為FALSE,則參數uItem是菜單項的標識;否則,表示菜單項的位置。
Ipmii:指向結構MenuItemInfo的指針,該結構含有菜單項的信息,并且指定將被修改的菜單項的屬性。
返回值:如果函數調用成功,返回非零值;如果函數調用失敗,返回值是零。
調用注意點:為了使鍵盤加速鍵能控制位圖或自己繪制的菜單項,菜單的擁有者必須處理WM_MENUCHAR消息。Windows CE環(huán)境下,只有下列值對參數Ipmii指向的MenuItemInfo結構中的fMask成員有效:MIIM_DATA、MIIM_ID和MIIM_TYPE 。如果MIIM_TYPE被指定,結構MenuItemInfo的fType成員必須為菜單項的當前類型,也就是說,該類型不能被改變。
Visual Basic環(huán)境下的源代碼(以實現(xiàn)圖2所示菜單為例):
’數據結構聲明
Public Type menuItemInfo
cbSize As Long
fMask As Long
fType As Long
……
End Type
’API函數聲明
Public Declare Function SetMenuItemInfo Lib “user32” Alias “SetMenuItemInfoA” (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As menuItemInfo) As Long
Public Declare Function GetMenuItemInfo Lib “user32” Alias “GetMenuItemInfoA” (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As menuItemInfo) As Long
Public Declare Function DrawMenuBar Lib “user32” (ByVal hwnd As Long) As Long
Public Declare Function GetMenu Lib “user32” (ByVal hwnd As Long) As Long
’在窗體載入過程(也可放在其他過程)中對菜單設置進行更改
Private Sub Form_Load()
Dim my_menuItemInfo As menuItemInfo
Dim return_value As Long
my_menuItemInfo.cbSize = 44
my_menuItemInfo.fMask = 16
’MIIM_TYPE
my_menuItemInfo.cch = 128
my_menuItemInfo.dwTypeData
= Space$(128)
return_value = GetMenuItemInfo(GetMenu(Me.hwnd), 2, 1, my_menuItemInfo)
my_menuItemInfo.fType = 16384
’MFT_RIGHTJUSTIFY
return_value = SetMenuItemInfo(GetMenu(Me.hwnd),2, 1, my_menuItemInfo)
DrawMenuBar GetMenu(Me.hwnd)
End Sub
圖2為Visual Basic環(huán)境下編譯的應用程序右順序對齊菜單顯示效果。
圖2 Visual Basic編譯的右順序對齊菜單應用程序
存在的問題
在程序運行過程中,我們常要對菜單標題進行更改,對用上述程序更改為右順序對齊后的菜單來說,由此帶來的一個問題是右順序對齊顯示效果失效,即已經在最右側的菜單恢復到左側排列,其原因是菜單標題字符串所在內存空間數據的更改。我們可以在Visual Basic程序中做實驗,在窗體鼠標單擊事件過程內加入如下語句:
Private Sub Form_Click()
location.Caption = “改變”
’目標位置菜單的名稱為location
End Sub
上述程序對顯示目標位置的菜單標題作了修改。運行該程序,用鼠標單擊窗體部分,結果如圖3所示。
圖3 失效的右順序對齊菜單
通過摸索,我們提出了一個變通解決方法:在欲將其調整到右側的菜單前面加一個空菜單,并在程序中對該空菜單進行右順序對齊編程。
仍以Visual Basic編譯環(huán)境下圖2所示應用程序的菜單為例,先打開“菜單編輯器”,在“目標位置”菜單前插入一個標題字符為空、名稱為“void_menu”的空菜單,接著編譯該程序。運行時API函數SetMenuItemInfo將“void_menu”空菜單及其右側的所有菜單(“目標位置”菜單等)均調整到菜單條最右側,因為“void_menu”空菜單的標題字符為空,所以該菜單不顯示,程序中接下來可以對“目標位置”菜單的標題字符內容作任意修改、更新。圖4為對添加的空菜單進行右順序對齊編程后的顯示效果,用前面窗體中的單擊事件過程的代碼進行測試,可以發(fā)現(xiàn)標題更改為“改變”的location菜單仍顯示在右側,完全達到目的。Visual C++編程環(huán)境中也可采用類似方法。