图标和光标是图形资源,图标通常用做应用程序的”形象代表”出现在文件浏览器、运行窗口左上角或程序的快捷方式等所有代表文件的地方。
为自己写的应用程序选一个合适的图标会使程序变得更为专业化。
而光标就是鼠标移动时屏幕上那个指示位置的东西,应用程序可以定义自己的光标,这样光标移到程序的客户区中就会变成需要的形状。
图标和光标的资源定义
和菜单、加速键等资源不同,在资源脚本文件中定义图标和光标做法是指定图标和光标的文件名,由资源编译器将像素数据读入再转换成二进制格式。
所以在资源定义之前要用其他工具先创建图标和光标文件。
图标和静态光标文件的扩展名分别是 ico 和 cur,还有一种扩展名为 ani 的动态光标文件。
光标和图标在资源文件中的定义语句是:
图标ID ICON [DISCARDABLE] 图标文件名 ;定义图标
光标ID CURSOR [DISCARDABLE] 光标文件名 ;定义光标
DISCARDABLE 关键字是内存选项,表示在不用的时候可以从内存暂时卸掉。
当文件名包含空格时,两边要用双引号引起来,图标ID和光标ID同样也可以用16位的整数或字符串表示。
这里是几个定义的例子:
MyIcon icon “1.ico”
;把1.ico定义为ID为“MyIcon”的图标资源
1000 icon discardable 2.ico
;把2.ico定义为ID为1000的图标资源
1001 icon “big icon.ico”
;把big icon.ico定义为ID为1001的图标资源
1002 cursor “big arrow.ani”
;把big arrow.ani定义为ID为1002的光标资源
GoodCursor cursor arrow.cur
;把arrow.cur定义为ID为“GoodCursor”的光标资源
资源文件中定义的图标可以不止一个,但Windows 在”我的电脑”中列出文件的时候总是使用资源中的第一个图标当做文件的图标。
所以在资源脚本文件中要把想用做程序图标的图标定义语句排在最前面。
使用图标和光标
在这里,我们依旧用一个例子来说明图标和光标的用法,程序是建立在 FirstWindow.asm 和 Menu.asm 程序的基础上的:Icon
经过上一节的“洗礼”,读者对菜单的定义应该很熟悉了,这里就不再说明IDM_MAIN的定义了,脚本文件中定义了ICO_SMALL,ICO_BIG两套图标和CUR_2静态光标,磁盘上还有个动态光标文件1.ani。
装入图标和光标
在WM_CREATE消息中,程序从资源节区中装入所有的图标和光标资源,装入图标是用 LoadIcon 函数来完成的:
invoke LoadIcon, hInstance, lpIconName
.if eax
mov hIcon, eax
.endif
当参数hInstance为NULL的时候,用 LoadIcon 还可以用预定义的lpIconName参数装入Windows 预定义的图标:
装入光标的函数有两个。装入在资源中定义的光标的函数是 LoadCursor,它的语法和 LoadIcon 几乎一样:
invoke LoadCursor, hInstance, lpCursorName
.if eax
mov hCursor, eax
.endif
LoadCursor 的用法也和 LoadIcon 相似,lpCursorName 是光标资源的ID,LoadCursor 也可以用指定 hInstance 为NULL的办法预定义光标:
另一个光标装入函数是 LoadCursorFromFile,这个函数从磁盘光标文件中装入光标:
invoke LoadCursorFromFile, lpCursorFileName
.if eax
mov hCursor, eax
.endif
一言以蔽之:历史产物!
现在来看如何使用图标,图标一般使用在对话框中或者程序窗口的标题栏中,要在标题栏中设置图标可以用向窗口发送 WM_SETICON 消息的办法实现:
invoke SendMessage, hWnd, WM_SETICON, ICON_BIG, hIcon
参数 ICON_BIG 或 ICON_SMALL,用来指定图标的分辨率为 32×32 还是 16×16。
如果要改变窗口的光标,不能使用WM_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