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了。
这些参数可以在API SPEC 7-2 标准里查到。
1″MT ; 应该是1 ”AMMT,螺距每英寸6牙,锥度1:8,紧密距9.525mm。
1.5AMMT ;V-055牙型,1:8,每英寸6牙,紧密距9.525mm。
NC16 ;V-055牙型,1:8,6牙,紧密距15.875mm、
NC23 ;V-038R牙型,1:6,4牙,紧密距15.875mm。
2 3/8PAC ;V-076牙型,1:8,4牙,紧密距15.875mm、
2 3/8REG ;V-040牙型,1:6,5牙,紧密距15.875mm。
NC 26 ;V-038R牙型,1:6,4牙,紧密距15.875mm。
STUB ACME -8 ;
STUB ACME -10 ;
STUB ACME -12 ; 这三个属于美标梯形螺纹,29度牙,没有标注螺纹尺寸和精度,数据不全。
呵呵,我以前写个小程序的时候,也找过这个资料,这是天极网上的资料,可以用VB编个更换桌面背景的程序:
SystemParametersInfoA的说明:
【说明】
允许获取和设置数量众多的windows系统参数。
【返回值】
Long,非零表示成功,零表示失败。会设置GetLastError。
【备注】
在调用这个函数之前,特别要注意将lpvParam参数定义成正确的数据类型。
【参数表】
uAction -------- Long,指定要设置的参数。参考uAction常数表。
uParam --------- Long,参考uAction常数表。
lpvParam ------- Any,按引用调用的Integer、Long和数据结构。对于String数据,请用SystemParametersInfoByval函数。具体用法参考uAction常数表。
-------------------实例------------------------。
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni As Long) As Long。
Const SPI_SETDESKWALLPAPER = 20。
Const SPIF_SENDWININICHANGE = &H2。
Const SPIF_UPDATEINIFILE = &H1。
Private Sub Form_Load()。
ChangeWP = SystemParametersInfo(SPI_SETDESKWALLPAPER, 。
0, "Path+BmpFile", 0)。
End Sub
使用这个例程确实能够切换墙纸,但存在以下问题:
1、用鼠标右键点击桌面,会看到【背景】→【墙纸】里面的文件名是空的。
2、重新启动后桌面墙纸消失。
3、没告诉您怎么切换"居中"或"平铺"。
怎么解决这些问题呢?
1、Windows的墙纸必须以BMP格式的文件存放在Windows目录下面,如果您的图片不在该目录或不是BMP文件,那么就会出现第一个问题。因此必须把您的图片转换成BMP文件并复制到Windows目录下面。
2、要使重新启动后需要在注册表里面修改相应的键值,具体位置是 HKEY_CURRENT_USER\Control Panel\desktop中的Wallpaper键,让它的键值等于您的全路径文件名。
3、在更换墙纸以前首先设置是否"居中",需要修改注册表中HKEY_CURRENT_USER\Control Panel\desktop中的TileWallpaper键,键值"0"表示"居中","1"表示"平铺"。
在MFC里,,用 ::后面跟函数名这种方式调用的函数是API函数,::前面有类标识的都是MFC的类的成员函数 ,不会是API函数 的,,MFC就是把API做了封装,,,那怕跟API函数 名一样,,但也不是API函数了,,afx_msg只是说明这个函数是某个消息的响应函数 。。。
意思就是说比如有三个参数,URL比如是getsum?def=yy&op=zz&&act=xx(如果是其它的JSON参数也是一样)
这三个参数def/op/act要进行排序(就是普通的字符串的大小比较),即顺序应该为act、def、op(至于顺序处理后再做什么处理,比如序列化或加密,那就看你那的需求了)
原文地址:http://www.qianchusai.com/%E6%8E%A8%E6%B5%8Bapi%E5%8F%82%E6%95%B0.html