第八课 菜单
本课中我们将在我们的应用程序中加入一个菜单。
理论:
菜单可以说是windows最重要的元素之一。有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且可以立即操作,无须去阅读手册了.正因为菜单给了用户一种方便的方式,所以您在应用程序中加入菜单时就要遵守一般的标准.譬如:一般头两个菜单项是"file"和"edit",最后是"help",您可以在这中间插入您要定义的菜单项.如果所运行的菜单命令会弹出一个对话框,那么就要在该菜单项后加入省略符(...).菜单是一种资源,除菜单外还有其它像对话框,字符串,图标,位图资源等.在链接时链接程序将把资源加入到可执行程序中去,最后我们的执行程序中就既包括机器指令又包括了资源. 您可以在任何文本编辑器中编写脚本文件,在文件中您可以指定资源呈现出来的外观和其它的一些属性.当然更直观的方法是用资源编辑器,通常资源编辑器都打包在编译环境中,像visual c++, borland c++等都带了资源编辑器. 我们可以按以下方式来定义一个菜单资源:- mymenu menu
{
[menu list here]
}
在菜单项的列表中是一大串的menuitem和popup语句。menuitem定义了一个菜单项,当选择后不会激活对话框。它的语法如下:
- menuitem "&text", id [,options]
- grayed 代表该菜单项处于非激活状态,即当其被选中时不会产生wm_command消息。该菜单以灰色显示。
- inactive 代表该菜单项处于非激活状态,即当其被选中时不会产生wm_command消息。该菜单以正常颜色显示。
- menubreak 该菜单项和随后的菜单项会显示在新列中。(译者注:比较难描述,请做实验。)
- help 该菜单项和随后的菜单项右对齐。(译者注:我在windows2000下编译有该标志的菜单项,该标志好像没起作用)
- 在wndclassex结构体的成员lpszmenuname中。譬如,您有一个菜单“firstmenu“,您可以按如下方法把它联系到您的窗口:
- .data
- menuname db "firstmenu",0
...........................
.code- ...........................
mov wc.lpszmenuname, offset menuname
........................... - 在createwindowex函数中指明菜单的句柄:
- .data
- menuname db "firstmenu",0
hmenu hmenu ?
...........................
.code- ...........................
invoke loadmenu, hinst, offset menuname
mov hmenu, eax
invoke createwindowex,null,offset clsname,\
offset caption, ws_overlappedwindow,\
cw_usedefault,cw_usedefault,\
cw_usedefault,cw_usedefault,\
null,\
hmenu,\
hinst,\
null\
...........................
- popup "&text" [,options]
{
[menu list]
}
例子:
第一个例子显示了指定一个菜单项的第一种方法:.386
.model flat,stdcall
option casemap:none
winmain proto :dword,:dword,:dword,:dword
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
classname db "simplewinclass",0
appname db "our first window",0
menuname db "firstmenu",0 ; the name of our menu in the resource file.
test_string db "you selected test menu item",0
hello_string db "hello, my friend",0
goodbye_string db "see you again, bye",0
.data?
hinstance hinstance ?
commandline lpstr ?
.const
idm_test equ 1 ; menu ids
idm_hello equ 2
idm_goodbye equ 3
idm_exit equ 4
.code
start:
invoke getmodulehandle, null
mov hinstance,eax
invoke getcommandline