我們可以把上例中的資源文件修改成這樣:
MyMenu1 MENUEX
BEGIN
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
END
END
解釋一下:
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 301
MYMENU1 MENUEX
BEGIN
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
END
END
繼續研究: 每一個菜單項後面可以有很多參數來指定不同的功能和顯示效果.
譬如: 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 301
MYMENU1 MENUEX
BEGIN
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
END
END
調用後的效果圖:
又如: 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 301
MYMENU1 MENUEX
BEGIN
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
END
END
調用後的效果圖:
圖片看不清楚?請點擊這裡查看原圖(大圖)。
再如: 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 301
MYMENU1 MENUEX
BEGIN
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
END
END
調用後的效果圖:
還是 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 301
MYMENU1 MENUEX
BEGIN
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
END
END