首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.2.3  API参数中的等值定义

再回过头来看显示消息框的语句:

invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK

在uType这个参数中使用了MB_OK,这个MB_OK是什么意思呢,先来看《Microsoft Win32 Programmer's Reference》中的说明:

uType —— 定义对话框的类型,这个参数可以是以下标志的合集:

要定义消息框上显示按钮,用下面的某一个标志:

MB_ABORTRETRYIGNORE —— 消息框有三个按钮:“终止”,“重试”和“忽略”

MB_HELP —— 消息框上显示一个“帮助”按钮,按下后发送WM_HELP消息

MB_OK —— 消息框上显示一个“确定”按钮,这是默认值

MB_OKCANCEL —— 消息框上显示两个按钮:“确定”和“取消”

MB_RETRYCANCEL —— 消息框上显示两个按钮:“重试”和“忽略”

MB_YESNO —— 消息框上显示两个按钮:“是”和“否”

MB_YESNOCANCEL —— 消息框上显示三个按钮:“是”、“否”和“取消”

要在消息框中显示图标,用下面的某一个标志:

MB_ICONWARNING —— 显示惊叹号图标

MB_ICONINFORMATION —— 显示消息图标

MB_ICONASTERISK —— 显示危险图标

MB_ICONQUESTION —— 显示问号图标

MB_ICONSTOP —— 显示停止图标

……

这些是uType参数说明中的一小半,可以看出,参数中可以用的值有很多种,让我们换一个值试试看,把语句改为:

invoke MessageBox,NULL,offset szText,\

offset szCaption, MB_ICONWARNING or MB_YESNO

再编译执行看,屏幕上出现了一个不一样的消息框,如图3.3所示。

图3.3  另一个消息框

和参数说明中的一样!消息框中出现了一个惊叹号图标,按钮也变成了“是”和“否”两个按钮!MB_ICONWARNING和MB_YESNO等参数究竟是什么意思呢,MASM中显然没有这样的预定义,让我们先来找Visual C++的头文件,在WinUser.h中可以找到下面一段:

/*

 * MessageBox() Flags

 */

#define MB_OK                       Ox00000000L

#define MB_OKCANCEL                 Ox00000001L

#define MB_ABORTRETRYIGNORE         Ox00000002L

#define MB_YESNOCANCEL              Ox00000003L

#define MB_YESNO                    Ox00000004L

#define MB_RETRYCANCEL              Ox00000005L

#define MB_ICONHAND                 Ox00000010L

#define MB_ICONQUESTION             Ox00000020L

#define MB_ICONEXCLAMATION          Ox00000030L

#define MB_ICONASTERISK             Ox00000040L

#if(WINVER >= Ox0400)

#define MB_USERICON                 Ox00000080L

#define MB_ICONWARNING              MB_ICONEXCLAMATION

#define MB_ICONERROR                MB_ICONHAND

#endif /* WINVER >= 0x0400 */

#define MB_ICONINFORMATION          MB_ICONASTERISK

#define MB_ICONSTOP                 MB_ICONHAND

……

显然,MB_YESNO就是4,MB_ICONWARNING就是30h,默认的MB_OK就是0,Win32 API的参数使用这样的定义方法是为了免除程序员死记数值定义的麻烦。在编写Win32汇编程序时,MASM32工具包中的Windows.inc也包括了所有这些参数的定义,只要在程序的开头包含这个定义文件:

include         windows.inc

就可以方便地完全按照API手册来使用Win32函数。

打开\masm32\include目录下的Windows.inc查看一下,可以发现整个文件总共有两万六千多行,包括了几乎所有的Win32 API参数中的常量和数据结构定义。正是有了这个文件中详尽的定义,Win32ASM才得以流行起来,试想一下,哪个程序员愿意每使用一个API语句,就到函数手册中去看参数,然后到Microsoft发布的Visual C++的头文件中去找对应的数值,再应用到汇编源程序中?这样会有80%以上的时间花在做无用功上(最后还是要骂Microsoft为什么不提供汇编格式的头文件,毕竟MASM32工具包不是Microsoft出的)。

有时候由于版本的原因,当使用最新的API手册时,会发现有些参数使用的常量在Windows.inc中并没有定义,这下惨了,谁都不知道类似于MB_XXXYYY的东西代表什么数值,Microsoft的《Microsoft Programmer's Reference》手册中从来就不会把参数对应的数值写进去。遇到这种情况,只有拿出最原始的办法了,就是到最新的Visual C++或SDK的include目录中去,在C语言格式的 .h头文件中把定义找出来,然后自行增补到Windows.inc中去。如果这样也找不到定义值的话,那只好放弃使用这个API了。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论