我們可以把上例中的資源檔修改成這樣:
MyMenu1 MENUEXBEGIN POPUP "&File" ,65535 BEGIN MENUITEM "&New" ,101 MENUITEM "&Open" ,102 MENUITEM "&Save" ,103 MENUITEM SEPARATOR MENUITEM "E&xit" ,104 END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,201 MENUITEM "&Copy" ,202 MENUITEM "&Paste" ,203 END POPUP "&Help" ,65535 BEGIN MENUITEM "&About" ,301 ENDEND
解釋一下:
1. 以前是使用 MENU 標識菜單資源的; 用 MENUEX 會有更多功能.
2、就像 Delphi 一樣, 它們使用 BEGIN 與 END 劃分語句塊, 也可以用 C/C++ 語言的方式: { ... }; 還有它的注釋也是 C 語言格式的.
3、MyMenu1 MENUEX 中的 MyMenu1 是自訂的該菜單的標識.
4、MyMenu1 MENUEX 後面可以有關於載入和釋放的控制符: PRELOAD、MOVEABLE PURE、DISCARDABLE(這個我沒找到權威資料, 有誰知道, 萬望告訴我; DISCARDABLE 用的最多, 可能是該資源沒被使用可以忽略的意思).
5、POPUP 表示這是一個快顯功能表項, 也就是: 它有下級菜單; 大家習慣用 65535 做標識.
6、MENUITEM 表示一個功能表項目, MENUITEM SEPARATOR 表示一個分隔線.
7、MENUITEM 的第一個參數是要顯示的文本, & 用來指定加速鍵.
8、MENUITEM 的第二個參數(參數用 , 號隔開)是該功能表項目的標識, 是一個整數值(1-65535); 當使用者點擊菜單時, 會送出 WM_COMMAND 訊息, 訊息的 wParam 參數就是這個標識, 從而讓我們知道點擊的是哪一個功能表項目; 這個標識有點像控制代碼, 一般在操作這個功能表項目時也需要這個標識.
現在要解決一個問題: 這些 MENUITEM 的標識 101、102、103 等等不好記憶, 如果定義成有字面意義的常量就好了.
在 Delphi 中使用 const 定義常量, 但資源檔是系統級的, 需要用 C/C++ 的方法來定義常量. 這樣我們可以修改如下:
#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGIN POPUP "&File" ,65535 BEGIN MENUITEM "&New" ,IDM_New MENUITEM "&Open" ,IDM_Open MENUITEM "&Save" ,IDM_Save MENUITEM SEPARATOR MENUITEM "E&xit" ,IDM_Exit END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,IDM_Cut MENUITEM "&Copy" ,IDM_Copy MENUITEM "&Paste" ,IDM_Paste END POPUP "&Help" ,65535 BEGIN MENUITEM "&About" ,IDM_About ENDEND
繼續研究: 每一個功能表項目後面可以有很多參數來指定不同的功能和顯示效果.
譬如: MFT_STRING(是字串)、MFS_CHECKED(選擇)、MFS_GRAYED(禁用)、MFT_RIGHTJUSTIFY(顯示在右邊)等等, 樣本如下:
#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGIN POPUP "&File" ,65535 BEGIN MENUITEM "&New" ,IDM_New ,MFT_STRING, MFS_CHECKED MENUITEM "&Open" ,IDM_Open ,MFT_STRING, MFS_GRAYED MENUITEM "&Save" ,IDM_Save MENUITEM SEPARATOR MENUITEM "E&xit" ,IDM_Exit END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,IDM_Cut MENUITEM "&Copy" ,IDM_Copy MENUITEM "&Paste" ,IDM_Paste END POPUP "&Help" ,65535 ,MFT_RIGHTJUSTIFY BEGIN MENUITEM "&About" ,IDM_About ENDEND
調用後的:
又如: MFT_MENUBREAK(分列)、MFT_MENUBARBREAK(分列並帶分割線), 樣本如下:
#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGIN POPUP "&File" ,65535 BEGIN MENUITEM "&New" ,IDM_New MENUITEM "&Open" ,IDM_Open ,MFT_MENUBREAK MENUITEM "&Save" ,IDM_Save MENUITEM SEPARATOR MENUITEM "E&xit" ,IDM_Exit END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,IDM_Cut MENUITEM "&Copy" ,IDM_Copy ,MFT_MENUBARBREAK MENUITEM "&Paste" ,IDM_Paste END POPUP "&Help" ,65535 ,MFT_RIGHTJUSTIFY BEGIN MENUITEM "&About" ,IDM_About ENDEND
調用後的:
再如: MFT_RIGHTORDER(靠右對齊)樣本如下:
#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGIN POPUP "&File" ,65535 BEGIN MENUITEM "&New" ,IDM_New ,MFT_RIGHTORDER ,MFS_CHECKED MENUITEM "&Open" ,IDM_Open MENUITEM "&Save" ,IDM_Save MENUITEM SEPARATOR MENUITEM "E&xit" ,IDM_Exit END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,IDM_Cut MENUITEM "&Copy" ,IDM_Copy MENUITEM "&Paste" ,IDM_Paste END POPUP "&Help" ,65535 BEGIN MENUITEM "&About" ,IDM_About ENDEND
調用後的:
還是 MFT_RIGHTORDER(靠右對齊) 的例子:
#define IDM_New 101#define IDM_Open 102#define IDM_Save 103#define IDM_Exit 104#define IDM_Cut 201#define IDM_Copy 202#define IDM_Paste 203#define IDM_About 301MYMENU1 MENUEXBEGIN POPUP "&File" ,65535 ,MFT_RIGHTORDER BEGIN MENUITEM "&New" ,IDM_New MENUITEM "&Open" ,IDM_Open MENUITEM "&Save" ,IDM_Save MENUITEM SEPARATOR MENUITEM "E&xit" ,IDM_Exit END POPUP "&Edit" ,65535 BEGIN MENUITEM "Cu&t" ,IDM_Cut MENUITEM "&Copy" ,IDM_Copy MENUITEM "&Paste" ,IDM_Paste END POPUP "&Help" ,65535 BEGIN MENUITEM "&About" ,IDM_About ENDEND