WIN32汇编语言教程:第05章 使用资源 · 5.2 图标和光标(2)
1. 装入图标和光标
在WM_CREATE消息中,程序从资源节区中装入所有的图标和光标资源,装入图标是用LoadIcon函数来完成的:
invoke LoadIcon,hInstance,lpIconName .if eax mov hIcon,eax .endif
hInstance参数指定实例句柄,表示图标资源定义在哪个可执行文件中,lpIconName参数指定图标资源的名称,它就是资源文件中定义的图标ID值,如果调用成功的话,函数返回图标句柄。
除了可以装入资源文件中定义的图标资源之外,当参数hInstance为NULL的时候,用LoadIcon还可以用预定义的lpIconName参数装入Windows预定义的图标,参数说明如表5.1所示。
表5.1 LoadIcon可以装入的预定义图标
lpIconName参数的预定义值 | 图 标 形 状 |
IDI_APPLICATION | 应用程序默认图标 |
IDI_ASTERISK | I符号图标 |
IDI_EXCLAMATION | 警告图标(黄色三角形+感叹号) |
IDI_HAND | 严重警告图标(一般是红色圆形+叉) |
IDI_QUESTION | 问号图标 |
IDI_WINLOGO | Windows标徽图标 |
装入光标的函数有两个。装入在资源中定义的光标的函数是LoadCursor,它的语法和LoadIcon几乎一样:
invoke LoadCursor,hInstance,lpCursorName .if eax mov hCursor,eax .endif
LoadCursor的用法也和LoadIcon相似,lpCursorName是光标资源的ID,LoadCursor也可以用指定hInstance为NULL的办法装入表5.2所列的预定义光标,这时候lpCursorName参数的取值如表5.2所示。
表5.2 LoadCursor可以装入的预定义光标
预 定 义 值 | 光 标 形 状 |
IDC_APPSTARTING | 标准的箭头形状加上小沙漏 |
IDC_ARROW | 标准的箭头形状 |
IDC_CROSS | 十字型光标 |
IDC_IBEAM | 要求输入文字时的I型光标 |
IDC_NO | 禁止光标(圆圈里面加一个斜杠) |
IDC_SIZE | 改变大小时的十字箭头 |
IDC_SIZENESW | 东北和西南方向的双向箭头 |
IDC_SIZENS | 向北和向南的双向箭头 |
IDC_SIZENWSE | 西北和东南方向的双向箭头 |
IDC_SIZEWE | 向西和向东的双向箭头 |
IDC_UPARROW | 垂直箭头光标 |
IDC_WAIT | 沙漏光标 |
读者可以注意到,预定义的图标和光标都是Windows系统中常用的,预定义图标常用在消息框中,预定义光标就是Windows鼠标属性中的光标。使用预定义图标和光标的好处是它们的形状会随着系统设置值的不同自动改变,如改变“控制面板”→“鼠标”→“指针”中的设置后,装入的光标会自动改变。
另一个光标装入函数是LoadCursorFromFile,这个函数从磁盘光标文件中装入光标:
invoke LoadCursorFromFile,lpCursorFileName .if eax mov hCursor,eax .endif
在Windows 9x中,静态光标文件*.cur既可以定义在资源文件中,也可以使用LoadCursorFromFile函数装入,但是动态光标文件*.ani只能通过文件方式装入。在Windows 2000及XP中,两种光标文件都可以通过资源装入。为了在不同的操作系统上都可以使用,例子文件使用LoadCursorFromFile函数来装入动态光标文件。
2. 使用图标和光标
现在来看如何使用图标。图标一般使用在对话框中或者程序窗口的标题栏中,要在标题栏中设置图标可以用向窗口发送WM_SETICON消息的办法实现:
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,hIcon
消息的wParam参数可以是ICON_BIG或ICON_SMALL,用来指定图标的分辨率为 32×32还是16×16。
要将窗口的光标设置为新的光标不能使用WM_SETCURSOR,这个消息是通知窗口重新刷新光标而不是让它设定指定的光标。Windows中有个SetCursor函数可以用来设置窗口光标,但这只能将新的光标维持很短一段时间,因为当Windows向窗口重新发送WM_SETCURSOR消息的时候,光标就会被设置为原来的样子,在第04章的实验中读者已经看到,WM_SETCURSOR是最频繁的消息之一,所以SetCursor并不能用来永久地改变窗口的光标。
如果要改变窗口的光标,正确的办法是用SetClassLong函数改变窗口类的属性,这个函数的使用方法如下:
invoke SetClassLong,hWnd,nIndex,dwNewLong
这个函数用来改变窗口类的属性,所以可以改变类中的光标设定,hWnd用来指定一个用这个类建立的某个窗口句柄,nIndex参数指定要改变窗口类的哪个属性,可以指定为GCL_HBRBACKGROUND,GCL_HCURSOR,GCL_HICON,GCL_HMODULE,GCL_MENUNAME,GCL_STYLE或GCL_WNDPROC等,它们分别表示要改变的窗口类的背景色、光标、图标、hInstance、菜单、风格或窗口过程地址,读者可以用这个函数来改变一个窗口类的几乎所有属性,程序中通过这个函数将窗口的光标在不同的光标句柄之间切换:
invoke SetClassLong,hWnd,GCL_HCURSOR,hCur1或hCur2