windows环境下32位汇编语言程序设计-第19章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
END
END
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
经过上一节的“洗礼”,读者对菜单的定义应该很熟悉了,这里就不再说明IDM_MAIN的定义了,脚本文件中定义了ICO_SMALL,ICO_BIG两套图标和CUR_2静态光标,磁盘上还有个动态光标文件1。ani。
Icon。asm的大部分是窗口模板程序的内容,和FirstWindow。asm是相同的,仅在窗口过程的WM_CREATE和WM_MAND增加了一些内容:
nst
szCursorFile db '1。ani';0
de
…
。if eax WM_CREATE
invoke LoadIcon;hInstance;ICO_BIG
mov hIcoBig;eax
invoke LoadIcon;hInstance;ICO_SMALL
mov hIcoSmall;eax
invoke LoadCursorFromFile;addr szCursorFile
mov hCur1;eax
invoke LoadCursor;hInstance;CUR_2
mov hCur2;eax
invoke SendMessage;hWnd;WM_MAND;IDM_BIG;NULL
invoke SendMessage;hWnd;WM_MAND;IDM_CUR1;NULL
。elseif eax WM_MAND
mov eax;wParam
movzx eax;ax
。if eax IDM_EXIT
call _Quit
。elseif eax IDM_BIG
invoke SendMessage;hWnd;WM_SETICON;ICON_BIG;hIcoBig
invoke CheckMenuRadioItem;hMenu;
IDM_BIG;IDM_SMALL;IDM_BIG;MF_BYMAND
。elseif eax IDM_SMALL
invoke SendMessage;hWnd;
WM_SETICON;ICON_BIG;hIcoSmall
invoke CheckMenuRadioItem;hMenu;
IDM_BIG;IDM_SMALL;IDM_SMALL;MF_BYMAND
。elseif eax IDM_CUR1
invoke SetClassLong;hWnd;GCL_HCURSOR;hCur1
invoke CheckMenuRadioItem;hMenu;
IDM_CUR1;IDM_CUR2;IDM_CUR1;MF_BYMAND
。elseif eax IDM_CUR2
invoke SetClassLong;hWnd;GCL_HCURSOR;hCur2
invoke CheckMenuRadioItem;hMenu;
IDM_CUR1;IDM_CUR2;IDM_CUR2;MF_BYMAND
。endif
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
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消息的时候,光标就会被设置为原来的样子,在第4章的实验中读者已经看到,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
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。3 位 图
5。3。1 位图简介
位图(Bitmap)是Windows操作系统存储图像的方式,图像中的每个像素对应存储器中的一个或多个数据位,如单色位图每个像素对应1位,16色位图每个像素对应4位,256色为8位,全彩色为24位等,所有的像素数据按照一行行的顺序排列在存储器中,每个像素对应的位数称为颜色深度。
位图的优越之处是操作的速度很快,计算机的屏幕显示是由硬件从视频缓冲区中的数据映射的,向视频缓冲区中拷贝数据就可以直接将图像显示在屏幕上,所以以位图的方式存储像素,显示图形的时间几乎就是向视频缓冲区拷贝数据的时间。
位图的不便之处一是尺寸问题:由于位图是不压缩的,它占用的空间很大,一个1 024×768像素、24位色的图像的大小为1 024×768×3,达2。3 MB;二是位图的缩放问题,读者都知道矢量和位图之间的关系,矢量图形(现在网上最流行的Flash就是矢量格式的)可以无限制缩放而不变形,因为它是根据矢量实时计算出像素数据的,而位图缩放后要对原来的像素数据进行插值计算,不可避免地会有失真。
在使用Windows的位图之前,必须搞清楚几个概念:位图、设备无关位图和位图文件。
单纯意义上的“位图”指的就是存放在内存中、可以马上使用的位图,它的颜色深度总是对应当前设备(如屏幕或打印机等)的颜色深度,不和具体的设备对应,位图数据是没有意义的,因为无法知道要把数据中的多少位解释成一个像素。
对于存放在磁盘上或别的地方的位图数据来说,它的颜色深度有可能和屏幕颜色深度不同,为了准确描述它的颜色信息,必须有像素数据的属性说明以及色彩表,在使用这个位图的时候,可以根据这些信息将像素数据转换到需要的颜色深度。色彩表和位图数据合在一起就叫做设备无关位图(DIB),因为它转换后可以用在不同颜色深度的设备上。Windows有函数专门用来处理DIB。使用DIB惟一的问题是当将高颜色数的DIB转换到低颜色数的设备 上时,由于色彩只能被转换成设备所能表示的最相近的颜色,所以可能会有很大的颜色失真。
DIB可以存放在磁盘上的位图文件中,位图文件一般以bmp为扩展名,它的内容包括一个bitmap文件头和DIB数据,bitmap文件头可以用来验证整个文件的有效性。所以简单地讲,DIB是位图数据的超集,位图文件又是DIB的超集。
Windows支持的图形文件格式只有bmp,ico与cur等几种,可以广泛用在GDI操作中的只有bmp文件,其他格式文件如jpg与tif等都是不能直接应用的,要使用这些文件,必须在代码中将它们转换到位图格式以后才行,所以要编一个仅支持bmp的图片浏览器是很简单的,而要支持其他格式麻烦就大了,仅jpg格式的解码就是个很复杂的问题!
5。3。2 在资源中定义位图
Windows对bmp文件的支持有两种方法,一种是打开bmp文件读入DIB部分的数据,然后用函数将DIB数据转换到位图数据;另一种方法就是在资源文件中用和ico,cur文件类似的方法定义位图资源,然后在程序中装入后使用。
在资源脚本文件中定义位图资源的语法是:
位图ID BITMAP 'DISCARDABLE' 位图文件名
在程序中可以用LoadBitmap函数装入位图资源:
invoke LoadBitmap;hInstance;lpBitmapName
。if eax
mov hBitmap;eax
。endif
LoadBitmap函数返回一个位图句柄,在程序退出的时候,位图句柄必须用DeleteObject函数释放。对位图资源的大部分操作涉及GDI的内容,这在第7章中再详细介绍。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。4 对 话 框(1)
5。4。1 对话框简介
顾名思义,对话框完成的是“对话”功能,应用程序一般建立一个主窗口用做工作界面,大部分的工作会在主窗口的客户区完成,但程序往往需要和用户交互,如输入参数和输入文本等,这些界面不必要全部放在主窗口中,习惯的做法是通过选择菜单项弹出一个窗口,然后在这个窗口中完成对话,这个窗口就是“对话框”,对话框中的按钮、文本框和图标等称为“子窗口控件”。
为了提示用户,习惯于在会引出对话框的菜单项后面加上省略号。如“文件”菜单中的“另存为。。。”表示会引出一个选择文件名的对话框,所以“另存为”3个字后面加了个省略号。对话框最典型的例子就是写字板“查找”菜单弹出的窗口以及IE浏览器中选择“Internet选项”菜单项弹出的设置窗口。
1。 对话框的类型
对话框分两类:modal对话框和modeless对话框,翻译成中文就是“模态的”和“非模态的”(也有的地方翻译成“模式的”和“非模式的”,Visual FoxPro中文版就是这样),它们之间的区别在于是否允许用户在不同窗口间进行切换:当显示非模态对话框时,用户可以随意在这个对话框和其他窗口之间切换;而显示一个模态对话框时,用户在关闭对话框之前不允许切换到同一程序的其他窗口中,但可以切换到其他程序的窗口中;如果显示的是操作系统所属的模态对话框(即“系统模态的”),则切换到其他任何程序的窗口都是不允许的。
Windows在资源文件中定义对话框,然后在程序中利用这个模板创建对话框,模态对话框和非模态对话框的资源定义是相同的,只是创建时调用的函数不同而已。
2。 对话框的工作原理
很明显,对话框和普通窗口之间有很多相似之处,实际上对话框就是基于窗口的,对话框的窗口风格使用的就是普通窗口的风格定义,对话框也有一个类似于窗口过程的对话框过程,但对话框和普通窗口在实现上又有很多不同之处,模态对话框和非模态对话框的实现也是不同的,图5。4对比了它们之间的不同之处。普通的窗口在建立之前需要用RegisterClass注册一个窗口类,然后用CreateWindow建立窗口,建立窗口所需的参数如窗口风格、大小位置和窗