汇编教程之菜单

本课中我们将在我们的应用程序中加入一个菜单。

理论:

菜单可以说是WINDOWS最重要的元素之一。有了它,用户可以方便地选择操作命令.用户只要细读一下所有的菜单项就可以明了应用程序所提供的大概功能,而且可以立即操作,无须去阅读手册了.正因为菜单给了用户一种方便的方式,所以您在应用程序中加入菜单时就要遵守一般的标准.譬如:一般头两个菜单项是"File"和"Edit",最后是"Help",您可以在这中间插入您要定义的菜单项.如果所运行的菜单命令会弹出一个对话框,那么就要在该菜单项后加入省略符(...).菜单是一种资源,除菜单外还有其它像对话框,字符串,图标,位图资源等.在链接时链接程序将把资源加入到可执行程序中去,最后我们的执行程序中就既包括机器指令又包括了资源. 您可以在任何文本编辑器中编写脚本文件,在文件中您可以指定资源呈现出来的外观和其它的一些属性.当然更直观的方法是用资源编辑器,通常资源编辑器都打包在编译环境中,像Visual C++, Borland C++等都带了资源编辑器. 我们可以按以下方式来定义一个菜单资源:

MyMenu MENU
{
[menu list here]
}

这和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 该菜单项和随后的菜单项右对齐。(译者注:我在WINDOWS2000下编译有该标志的菜单项,该标志好像没起作用)

您可以单独使用以上标志位,也可以把它们或在一起。当然INACTIVE和GRAYED不能同时使用。 POPUP的语法如下:

POPUP "&text" [,options]
{
[menu list]
}

POPUP定义了一个菜单项当该菜单项被选中时又会弹出一个子菜单。另外有一种特别类型的MENUITEM语句MENUITEM SEPARATOR,它表示在菜单项位置画一条分隔线。定义完菜单后,您就可以在程序中使用脚本中定义的菜单资源了。您可以在程序的两个地方(或叫做用两种方式)使用它们:

在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\
...........................

您也许会问,这两着之间有什么不同呢?当您用第一种方法时,由于是在窗口类中指定,故所有由该窗口类派生的窗口都将有相同的菜单。如果您想要从相同的类中派生的窗口有不同的菜单那就要使用第二中方法,该方法中通过函数CreateWindowEx指定的菜单会“覆盖”WNDCLASSEX结构体中指定的菜单。接下来我们看看当用户选择了一个菜单项时它是如何通知WINDOWS 窗口过程的:当用户选择了一个菜单项时,WINDOWS窗口过程会接收到一个WM_COMMAND消息,传进来的参数wParam的底字节包含了菜单项的ID号。好了,上面就是关于菜单项的一切,下面我们就来实践。

时间: 2025-01-01 15:30:30

汇编教程之菜单的相关文章

Dreamweaver网页制作教程:菜单概述

dreamweaver|菜单|教程|网页 菜单概述 本节提供 Dreamweaver MX 2004中各菜单的简要说明.下图为菜单条: 以下分别叙述菜单选项: 文件菜单 编辑菜单     "文件"菜单 包含"新建"."打开"."保存"."保存全部",还包含各种其他命令,用于查看当前文档或对当前文档执行操作,例如"在浏览器中预览"和"打印代码". "编辑&qu

汇编教程:连接数据源

本教程中,我们将学习使用ODBC APIs的细节. 因为我们的程序并不与ODBC驱动程序直接通信,而是通过ODBC管理器来定义一系列APIs供你的程序调用以完成工作,所以我们需要包含odbc32.inc和odbc32.lib文件,当然还有windows.inc. 连接数据源需要以下几步: 分配一个环境句柄(environment handle). 在进行每个ODBC任务(session)时仅需这样做一次.一旦获得了句柄,我们就可修改环境属性来适合我们的需要.你可以把这想象为在DB工作中创建一个w

汇编教程:汇编语言编程实例

汇编语言编程实例一这一章,我们要把我们已学的知识集合起来.具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microsoft Access 97) . 注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 "SQL_NULL_HANDLE",将得到下面这行: SQL_NULL_HANDLE equ 0L 将0后面的"L&q

汇编教程:控制转移(2)

2.关于实例三的说明 有些步骤的实现方法已在前面的实例中做过介绍,下面就任务内无特权级变换的转移和使用局部描述符LDT等作些说明: (1)实模式下初始化LDT 演示任务使用了局部描述符表LDT,本实例中该LDT在实模式下初始化(当然,也可以在使用LDT前的保护模式初始化).为了简便,LDT中各描述符的界限和属性值在定义时预置,利用一个子程序设置各段的段基地址.为方便起见,在定义时把各段的段值安排在相应描述符的段基地址低16位字段中.由于实例中各段在实模式下定位(这是因为程序是从实模式下启动执行的

汇编教程:虚拟设备驱动程序结构

现在大家对vmm和vxd有了一定的了解,接下来我们来看一看如何编写vxd代码.首先,你必须具备Windows 95/98 Device Driver Development Kit.Window95 ddk只有MSDN 订户才能拿到,但Windows98 ddk却可以免费从Microsoft公司取得.尽管Windows 98 ddk是面向WDM的,但你还是可以用它来开发VxD程序.你可以从 http://www.microsoft.com/hwdev/ddk/install98ddk.htm?下

汇编教程:客户寄存器结构

我们将学习本教程中另外一个重要的结构,叫客户寄存器结构.在本文中,V86指虚拟8086模式.在这里下载例子程序 理论 VxDs与正常的win32/win16/DOS应用程序有很大不同.大多数情况下,当其他应用程序正常工作时,它们是休眠的.它们象一个监管者一样工作,其作用是监视ring-3应用程序并在其出错时改正它们.下面是其工作时的典型的情况: 1.中断发生时 2.VMM得到控制权时 3.VMM存贮寄存器组的值时 4.VMM服务于中断或调用其他VxDs完成此工作时 5.VMM交还控制权给被中断的

汇编教程:ODBC基础

这是使用 win32asm进行数据库编程系列的第一份教程.在如今的IT界,数据库编程变的越来越重要,所以我们不能再忽视它.但如今有很多种数据库在使用,如果我们为了实现win32下数据库汇编语言编程而学习各种数据库文件格式,所花时间大概称得上"永恒". 幸运的是,Microsoft的一项技术使得我们得以摆脱这个大麻烦.它被称为ODBC,是开放式数据库互连(Open Database Connectivity)的缩写,这是一族API,与Windows API相似.它主要与数据库打交道.就是

汇编教程:多文档界面(MDI)

本教程告诉你怎样创建MDI应用程序.事实上并不是很困难. 理论: 多文档界面(MDI)是同一时刻处理多个文档的应用程序的一个规范. 你很熟悉记事本.它是单文档界面(SDI)的一个例子.记事本在一个时候只能处理一个文档.假如你希望打开另一个文档,你首先必须关闭你前面打开的那一个.你可以想象这有多麻烦. 和Microsoft Word相比:Word可以随心所欲的在同一时刻打开任意多个文档,而且可以让用户选择使用哪一个文档.Microsoft Word 是多文档界面(MDI)的一个例子. MDI应用程

汇编教程:Win32调试API(3)

在本章中,我们将继续探讨win32调试api.特别地,我们将学习如何去跟踪被调试程序. 理论: 如果你以前使用过调试器,那么你应对跟踪比较熟悉.当"跟踪"一个程序时,程序在每执行一条指令后将会停止,这使你有机会去检查寄存器/内存中的值.这种单步运行的官方定义为跟踪(tracing). 单步运行的特色是由CPU本身提供的.标志寄存器的第8位称为陷阱标志trap flag.如果该位设置,则CPU运行于单步模式.CPU将在每条指令后产生一个debug异常.当debug 异常产生后,陷阱标志自