我们可以把上例中的资源文件修改成这样:
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++ 的方法来定义常量. 这样我们可以修改如下:
譬如: MFT_STRING(是字符串)、MFS_CHECKED(选择)、MFS_GRAYED(禁用)、MFT_RIGHTJUSTIFY(显示在右边)等等, 示例如下:
又如: MFT_MENUBREAK(分列)、MFT_MENUBARBREAK(分列并带分割线), 示例如下:
再如: MFT_RIGHTORDER(右对齐)示例如下:
还是 MFT_RIGHTORDER(右对齐) 的例子:
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