windows sdk编程系列文章06 ---- 菜单.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:20 大小:84KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

windows sdk编程系列文章06 ---- 菜单.doc

windowssdk编程系列文章06----菜单.doc

预览

免费试读已结束,剩余 10 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

windowssdk编程系列文章----菜单2008-04-0922:34本课中我们将在我们的应用程序中加入一个菜单。理论:菜单可以说是WINDOWS最重要的元素之一。有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且可以立即操作,无须去阅读手册了.正因为菜单给了用户一种方便的方式,所以您在应用程序中加入菜单时就要遵守一般的标准.譬如:一般头两个菜单项是"File"和"Edit",最后是"Help",您可以在这中间插入您要定义的菜单项.如果所运行的菜单命令会弹出一个对话框,那么就要在该菜单项后加入省略符(...).菜单是一种资源,除菜单外还有其它像对话框,字符串,图标,位图资源等.在链接时链接程序将把资源加入到可执行程序中去,最后我们的执行程序中就既包括机器指令又包括了资源.您可以在任何文本编辑器中编写脚本文件,在文件中您可以指定资源呈现出来的外观和其它的一些属性.当然更直观的方法是用资源编辑器,通常资源编辑器都打包在编译环境中,像VisualC++,BorlandC++等都带了资源编辑器.我们可以按以下方式来定义一个菜单资源:MyMenuMENU{[menulisthere]}这和C语言中的结构体的定义非常相似。MyMenu类似于被定义的变量,而MENU则类似于关键字。当然您可以用另外一种办法,那就是用BEGIN和END来代替花括号,这和PASCAL语言中的风格相同。在菜单项的列表中是一大串的MENUITEM和POPUP语句。MENUITEM定义了一个菜单项,当选择后不会激活对话框。它的语法如下:MENUITEM"&text",ID[,options]它由关键字MENUITEM开头,紧跟在MENUITEM后的是指菜单项的名称字符串,符号“&“后的第一个字符将会带下画线,它也是该菜单项的快捷键。ID的作用当该菜单被选中时,WINDOWS的消息处理过程用来区分菜单项用的。毫无疑问,ID号必须唯一。options有以下可供选择的属性:GRAYED代表该菜单项处于非激活状态,即当其被选中时不会产生WM_COMMAND消息。该菜单以灰色显示。INACTIVE代表该菜单项处于非激活状态,即当其被选中时不会产生WM_COMMAND消息。该菜单以正常颜色显示。MENUBREAK该菜单项和随后的菜单项会显示在新列中。HELP该菜单项和随后的菜单项右对齐。您可以单独使用以上标志位,也可以把它们或在一起。当然INACTIVE和GRAYED不能同时使用。POPUP的语法如下:POPUP"&text"[,options]{[menulist]}POPUP定义了一个菜单项当该菜单项被选中时又会弹出一个子菜单。另外有一种特别类型的MENUITEM语句MENUITEMSEPARATOR,它表示在菜单项位置画一条分隔线。定义完菜单后,您就可以在程序中使用脚本中定义的菜单资源了。您可以在程序的两个地方(或叫做用两种方式)使用它们:在WNDCLASSEX结构体的成员lpszMenuName中。譬如,您有一个菜单“FirstMenu“,您可以按如下方法把它联系到您的窗口:(见FirstWindow6-1)TCHARMenuName[]=_T("FirstMenu");...........................stdWndClass.lpszMenuName=MenuName;...........................在CreateWindowEx函数中指明菜单的句柄:(见FirstWindow6-2)HMENUhMenu;TCHARMenuName[]=_T("FirstMenu");......................................................hMenu=LoadMenu(hInstance,MenuName);hWinMain=CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain,WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,hMenu,hInstance,NULL);...........................您也许会问,这两着之间有什么不同呢?当您用第一种方法时,由于是在窗口类中指定,故所有由该窗口类派生的窗口都将有相同的菜单。如果您想要从相同的类中派生的窗口有不同的菜单那就要使用第二中方法,该方法中通过函数CreateWindowEx指定的菜单会“覆盖”WNDCLASSEX结构体中指定的菜单。接下来我们看看当用户选择了一个菜单项时它是如何通知WIND