Windows 編程[13] – 菜單與菜單資源(二)

來源:互聯網
上載者:User
我們可以把上例中的資源檔修改成這樣:
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.