已阅读5页,还剩115页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计,吴向军,2011.5.10,E-Mail:issxjwu,第13章Windows应用程序的编程,Windows系统是一个应用极其广泛的操作系统,在Windows环境下开发各类应用程序是多种流行程序设计语言所支持的主要目标.汇编语言虽然是一种低级程序设计语言,但随着其结构化程度的提高,其表达能力和结构化特点也都趋向于高级语言.在相关库文件的开发和完善后,用汇编语言开发Windows应用程序也变得越来越简单.本章以MASM32v10为编程环境介绍一些最基本的Windows应用程序的编程方法,给出了Windows应用程序的基本结构和每阶段所做的主要工作.结合一些具有一定代表性的示例说明Windows应用程序中的基本元素,如对话窗口、按钮、滚动条、编辑框、滑动条、进度条和文本框等控件的使用方法.除此之外,还介绍了绘画方法和命令行参数的提取与分解方法,这些都为进一步运用汇编语言进行Windows应用程序的开发打下一定的基础.,第13章Windows应用程序的编程,13.1消息框消息框是Windows系统及其应用程序向用户提供内部提示信息的一种最基本的方式,用户可以根据实际情况进行适当的选择.其调用方式虽然比较简单,但其所包含的组成部分与其他函数是一致的,所以,掌握消息框的使用对学习其它内容是有很大帮助的.下面用显示“Hello,World”消息框的简短程序来介绍相关内容.,第13章Windows应用程序的编程,13.1消息框例13.1编写一个消息框,其显示内容为“Hello,World”.解:.386.modelflat,stdcalloptioncasemap:none;区分大小写includemasm32includewindows.incincludemasm32includeuser32.incincludemasm32includekernel32.incincludelibmasm32libuser32.libincludelibmasm32libkernel32.lib.dataszTitledbMASM32forWindows,0szMsgdbHello,World,0.codestart:invokeMessageBox,NULL,addrszMsg,addrszTitle,MB_OKinvokeExitProcess,0endstart,第13章Windows应用程序的编程,13.1消息框例13.1的程序结构与前面所学的程序结构是一致的,所不同的是增加了一些特定的说明性伪指令和调用了二个API函数(ApplicationProgrammingInterfaceFunction).该程序运行时将发出一个“咚”的声音,并显示一个消息框.消息框的显示效果如图13.1所示.下面对例13.1程序中的指令及其相关信息进行说明.1)说明性部分CPU类型可选的CPU类型有.386,.386P,.486,.486P,.586(Pentium),.586P,.686(PentiumPro),.686P等.附有字符“P”的处理器符号表示当前编写的程序中可以使用特权指令,否则,在程序中不可使用特权指令.,第13章Windows应用程序的编程,13.1消息框1)说明性部分存储模型说明有关存储模式伪指令.model的作用请见6.4.1节中的叙述.字母大小写的说明一般情况下,Windows应用程序中的标识符都采用“区分字母大小写”策略,这样可使标识符具有更严格的个性特征,如“szMsg”和“szmsg”是不同的两个标识符.包含文件的说明伪指令include用来指定程序所需要的常量定义文件、子程序原型定义文件和宏定义文件等,有关伪指令include的作用请见9.6.8节中的叙述.在MASM32编程环境中,文件windows.inc保存了与Windows有关的常量定义,文件xxx.inc包含了库文件xxx.lib中函数的原型定义,文件macros.asm中定义了一些非常有用的宏.includemasm32includewindows.inc;常量定义文件includemasm32includeuser32.inc;相应库文件函数的原型说明文件includemasm32includekernel32.incincludemasm32macrosmacros.asm;宏定义文件在文件夹include和macros中还有很多其他常量定义文件、原型定义文件或宏定义文件,程序员可根据具体的需求进行查阅,本章所用到的系统函数都给出了它们所在原型定义文件和库文件(如表13.5所示),其他未使用到的相关文件在此不再说明.,第13章Windows应用程序的编程,13.1消息框1)说明性部分库文件的说明伪指令includelib用来指定当前程序在连接时所需要的库文件.每条伪指令只能说明一个库文件,程序员可书写多条该伪指令来指定当前程序所需要的库文件.伪指令includelib的说明形式如下:includelib其中库文件名包括文件路径、名称和后缀,默认的库文件后缀为.LIB.例如,includelibmasm32libkernel32.libincludelibmasm32libkernel32;以上两种说明形式是等价的如果库文件名或路径中含有某些特殊字符,如、;、单引号或双引号等,那么库名两边的符号“”都必须要书写.但在Windows操作系统中,文件夹和文件名都不允许含有这些特殊字符,所以,在编程时无需考虑这一规定.,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox函数MessageBox是显示一个消息框.其调用形式如下:invokeMessageBox,hWnd,lpszMsg,lpszTitle,uType入口参数:hWnd消息框的父窗口.如果其值为NULL,那么该消息框无父窗口;lpszMsg消息框所显示信息的字符串地址,该字符串以0为结束符;lpszTitle信息窗口的标题信息地址.如果该地址为NULL,那么其标题信息为默认字符串“错误”;uType消息框的各种显示属性,如按钮种类、图标信息、字符串的显示顺序和消息框的显示方式等,不同类的显示属性可通过“或”运算组合在一起来确定消息框的整体显示效果和功能.理解和掌握每类显示属性符及其作用对运用消息框具有极大的帮助.,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox介绍参数uType对应的各种显示属性符(定义在文件windows.inc中)及其含义.(1)消息框的按钮属性一个消息框可选用一组按钮,每组按钮可包含若干具体按钮.可根据显示信息的性质来使用相应的按钮组.所有按钮组符号及其对应按钮信息如下表所示.表13.1消息框的按钮组符号和具体按钮的对应关系,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(1)(1)消息框的按钮属性“帮助”按钮可以和其他按钮组进行组合,如MB_OKCANCELorMB_HELP.除“帮助”按钮外,其他按钮组之间都不能进行组合,非法的组合将导致函数MessageBox的调用失败.函数MessageBox的下面二次调用所产生的消息框如下图所示.invokeMessageBox,NULL,addrszMsg,addrszDlgTitle,MB_YESNOinvokeMessageBox,NULL,addrszMsg,addrszDlgTitle,MB_YESNOorMB_HELP,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(2)焦点按钮的设置当显示有多个按钮的消息框时,存在当前“焦点”(focus)停留在哪个按钮上的问题.在缺省情况下,第1个按钮将是其焦点按钮,但可用符号MB_DEFBUTTON1、MB_DEFBUTTON2、MB_DEFBUTTON3或MB_DEFBUTTON4来指定具体按钮为其焦点按钮.如果指定的焦点按钮在消息框中不存在,那么第1个按钮被设置为焦点按钮.例如,“MB_YESNOorMB_DEFBUTTON2”设置焦点在第2个按钮上,“MB_YESNOorMB_DEFBUTTON4”设置焦点在第1个按钮上,因为当前消息框中没有第4个按钮.,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(3)消息框的图标属性根据显示信息的性质,可把信息分为提示信息、询问信息和警示信息等.为了突出信息的性质,函数MessageBox用一组特殊的图标来表达,程序员可运用信息图标符号来显示对应的信息图标.信息图标符号及其显示效果如表13.2所示.表13.2消息框的图标种类定义符及其显示效果,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(3)消息框的图标属性函数MessageBox的下面调用所产生的消息框如图13.3所示.invokeMessageBox,NULL,addrszMsg,addrszDlgTitle,MB_YESNOorMB_ICONINFORMATION,MB_ICONINFORMATION的作用,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(4)消息框的显示属性消息框的显示方式包括信息窗口的显示方式和信息的显示方式.信息窗口的显示方式表示该信息窗口能否被其它窗口覆盖、是否必须响应该窗口信息(即在完成该窗口操作之前是否允许操作其他窗口)等.信息的显示方式包括信息显示的对齐方式(左对齐和右对齐)和信息的读写顺序(“从左向右”和“从右向左”),其中“从右向左”的读写顺序是希伯来和阿拉伯民族的语言习惯.为了满足消息框的不同显示需求,函数MessageBox提供了相应的显示方式.消息框的显示模式符及其含义如表13.3所示.,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(4)消息框的显示属性表13.3消息框的部分模式属性,第13章Windows应用程序的编程,2)显示消息框函数MessageBox(4)消息框的显示属性函数MessageBox的下面调用所产生的消息框如图13.4所示.InvokeMessageBox,NULL,addrszMsg,addrszDlgTitle,MB_YESNOorMB_HELPorMB_ICONQUESTIONorMB_RIGHT由图13.4可看出:窗口的标题和显示信息都是“右对齐”.,MB_RIGHT的作用,第13章Windows应用程序的编程,2)显示消息框函数MessageBox(5)函数的返回值消息框显示后,用户可根据具体情况点击不同的按钮,点击按钮所对应的值就是该函数的返回值,并保存在寄存器EAX之中.函数MessageBox的返回值如表13.4所示.表13.4消息框点击的按钮及其相应的返回值如果消息框中含有“取消”按钮,那么按Esc键和点击“取消”按钮是等效的.如果消息框中没有“取消”按钮,那么按Esc键将无任何效果.如果函数调用失败,那么其返回值为0,并可调用函数GetLastError来得到其错误代码.,第13章Windows应用程序的编程,2)显示消息框函数MessageBox(5)函数的返回值例13.2编写一个“确认”消息框,其显示内容为“Areyouready?”.用户可以选择“Yes”或“No”.如果选择“Yes”,那么程序结束,否则继续询问,但最多只有3次确认机会.解:;前面内容与例13.1完全一致.dataszDlgTitledbSystemMessage,0szMsgdbAreyouready?,0nTimedw?.codestart:movnTime,3.repeatinvokeMessageBox,NULL,addrszMsg,addrszDlgTitle,MB_YESNOorMB_ICONQUESTIONdecnTime.until(nTime=0|eax=IDYES);函数MessageBox的返回值保存在eax之中invokeExitProcess,0endstart,第13章Windows应用程序的编程,13.1消息框2)显示消息框函数MessageBox(5)函数的返回值在用户操作时,可以点击“是”按钮(或Alt+Y),也可以点击“否”按钮(或Alt+N),但最多只有三次“否”的机会.虽然消息框的使用比较简单,但它含有编写Windows应用程序的一些最基本的元素,灵活运用各类消息框对提高程序的交互性具有一定的帮助.,第13章Windows应用程序的编程,13.2编程伪指令13.2.1多路分支语句分支结构是程序的三大结构之一,汇编语言提供了大量的转移指令来支持该类结构的C程序设计.多路分支语句switch是一种非常有用的分支表达方式,它可清晰地表达出根据某数据量进行不同分支的逻辑结构,在各类高级语言中也存在类似的表达方式.MASM32编程环境提供了二种分支语句:数值分支和字符串分支,它们是以宏定义的形式存在的,所以,在编程过程中需先书写下面三条包含伪指令.includemasm32macrosmacros.asmincludemasm32includemasm32.incincludelibmasm32libmasm32.lib其中文件macros.asm含有分支语句中的各种宏定义,文件masm32.inc含有相关子程序的原型定义,其实现代码存储在库文件masm32.lib之中.,第13章Windows应用程序的编程,13.2编程伪指令13.2.1多路分支语句1)用数值进行分支的语句switchVariablecaseValue11,Value12,;当Variable=Value11或Variable=Value11,时所执行的指令序列caseValue21,Value22,;当Variable=Value21或Variable=Value22,时所执行的指令序列.default;当Variable不等于前面所列各值时所执行的指令序列endsw其中,switch和endsw必须是成对出现的,Variable只能是32位寄存器或内存变量.,第13章Windows应用程序的编程,13.2.1多路分支语句1)用数值进行分支的语句下面是根据寄存器eax的值进行多路分支的示例.switcheaxcase1,3,7;eax=1或eax=3或eax=7时addebx,-1incedxcase2;eax=2时addebx,-5incecxdefault;eax的值不是1和2时inceaxendsw由“case1,3,7”可知:汇编语言的分支语句与C/C+中的switch语句具有相似的语义.,第13章Windows应用程序的编程,2)用字符串进行分支的语句在字符串进行比较时存在“区分大小写”和“不区分大小写”二种形式,MASM32提供了相对应的二种分支语句形式:switch$.case$else$endsw$和switchi$.casei$elsei$endswi$.在进行字符串比较时,前者需要区分大小写,后者则不区分大小写.在这二种语句中,其子句case$和casei$,else$和elsei$是不能混合使用的,也就是说,“区分大小写”和“不区分大小写”是不能混合要求的.由于这二种语句形式基本上是一致的,所以下面仅以switch$.Endsw$来加以说明.switch$StringAddresscase$String1;当StringAddress=String1时所执行的指令序列case$String2;当StringAddress=String2时所执行的指令序列else$;当StringAddress所指向的字符串不是前面所列时要执行的指令序列endsw$字符串分支语句不能表达“多种情况”对应同一组执行代码序列的功能.如果有这样的需求,程序员需改用“.if.else.endif”的语句形式,或直接用字符串比较指令cmps等来进行相应的编程.,第13章Windows应用程序的编程,2)用字符串进行分支的语句例13.3用字符串szMZ中的信息进行多路分支.若其民族名称是中国的民族名称,则用寄存器EBX保存其序号(假设性的),否则,程序显示一个提示信息.szMZdb希腊族,0szTitledb系统信息,0szMsgdb国内无此民族,0movebx,-1switch$addrszMZcase$蒙古族movebx,1case$回族movebx,2;这里可一一罗列全国其他民族名称else$invokeMessageBox,NULL,addrszMsg,addrszTitle,MB_OKendsw$,第13章Windows应用程序的编程,13.2编程伪指令13.2.2调试语句程序员在编写程序时出现一些逻辑错误几乎是不可难免的,而用汇编语言来编程就更是如此,所以,在用汇编语言编写程序时,调试程序是程序员必须掌握的一门重要的基本技能.在MASM6.1x编程环境中,它像其他高级语言编程环境一样提供了“源程序”级的符号跟踪调试工具CodeView,这样,其程序的调试工作相对来说比较简单、直观.但MASM32环境没有这样可视化的“源程序”级的调试工具,其提供的调试工具VKdebug只能通过在程序中插入各种输出语句来了解程序运行时的动态变化.在MASM32的编程环境下,要想使用调试工具VKdebug,则必须先在程序的前面用下面伪指令包含该工具有关的宏定义和库文件.includemasm32includemasm32.incincludemasm32includedebug.incincludelibmasm32libdebug.lib,第13章Windows应用程序的编程,13.2编程伪指令13.2.2调试语句假设在例13.3的程序运行过程中,想了解switch$语句用于分支的字符串内容和分支结果,那么可在switch$的结束语句endsw$后加入二条调试语句来实现.具体如下:switch$addrszMZ;与例13.3的编程语句一致endsw$PrintStringszMZ;输出字符串szMZPrintDecebx;输出寄存器ebx之值上述调试语句分别显示字符串szMZ的内容和寄存器ebx的值,这二条调试语句所输出的调试信息如图13.6所示.,第13章Windows应用程序的编程,13.2编程伪指令13.2.2调试语句在程序调试完毕时,无需一一删除源程序中的所有调试语句,只需在包含“debug.inc”的伪指令之后添加下面的符号常量说明语句,使之后的所有调试语句不再产生实质性代码,但原来的调试语句仍然在源程序之中.DBGWIN_DEBUG_ON=0;使调试语句无效当需要再次调试该程序时,只需注释掉上面的说明语句,因为在文件debug.inc中已有下面的符号常量说明语句.DBGWIN_DEBUG_ON=1有关调试工具VKdebug中其他输出语句的功能请见14.2.4节中的说明.,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.1Windows程序的基本结构Windows应用程序的运行效果多种多样,但其程序的结构比较简单,几乎是一致的.其程序可分为以下三部分:说明性部分:CPU类型说明、存储模式说明、字母大小写说明、系统函数的原型说明、库文件说明和自定义子程序的原型定义等;数据段部分:说明程序所需要的全局变量,主要有:模块句柄、命令行首地址、窗口类名称和窗口句柄等;代码段部分:初始化阶段、窗口准备阶段、消息循环阶段、消息处理过程WndProc和进程终止运行阶段等.,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.1Windows程序的基本结构在说明性部分,CPU类型、存储模式和字母大小写说明等基本上是固定的,系统函数的原型和库文件的说明是以“include”伪指令的形式来书写的,程序员将根据具体的需要来包含相应的文件,自定义子程序的原型定义是程序员在编程时所定义的子程序,显然这部分的原型定义会因不同的程序功能而有所不同.代码段部分是程序设计的主体,是窗口操作功能的具体实现部分.Windows应用程序的基本结构和各阶段所做的主要工作如图13.7所示.下面用一个简单而完整的Windows应用程序来说明图13.7中各阶段所做的具体工作,每阶段所使用的API函数在附录四中逐一进行详细说明.这样,程序员可在此基础上根据自己的实际需求开展相应的编程工作.,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.386.modelflat,stdcalloptioncasemap:noneincludemasm32includewindows.incincludemasm32macrosmacros.asmincludemasm32includekernel32.incincludemasm32includeuser32.incincludemasm32includegdi32.incincludelibmasm32libkernel32.libincludelibmasm32libuser32.libincludelibmasm32libgdi32.lib;子程序的原型说明,见第7.5.8节中的有关说明WinMainPROTO:DWord,:DWord,:DWord,:Dword;主要的子程序WndProcPROTO:Dword,:DWord,:DWord,:DWord;窗口消息处理子程序.data;数据段的定义szCaptiondbSimpleWindow,0Cmdlinedd0hWnddd0hInstancedd0szIcondbC:windowsServicePackFilesi386msnms.ico,0;图标文件szCursordbC:windowsCursorshorse.ani,0;动画鼠标光标文件,第13章Windows应用程序的编程,包含文件部分:宏、API函数的原型和库文件用户函数的原型说明,说明性部分:CPU、存储模式和字母大小写,数据段定义部分,全局变量定义,包含文件的说明,说明性部分,说明性部分,数据段部分,第13章Windows应用程序的编程,获取进程句柄(GetModuleHandle)和命令行首地址(GetCommandLine),设置窗口类信息,如风格,窗口处理函数,图标(LoadIcon)和光标(LoadCursor)等.注册该窗口类(RegisterClassEx),为创建其对象作准备.,设置窗口基本信息,如位置,大小和风格等.用已注册的窗口类创建窗口(CreateWindowEx),装入(LoadMenu)和设置(SetMenu)窗口菜单,如果存在窗口菜单的话,显示(ShowWindow)和刷新(UpdateWindow)窗口,从消息队列中获取操作消息(GetMessage),装入快捷键(LoadAccelerators),如果存在的话,eax=0?,转换(TranslateMessage)和发送(DispatchMessage)消息,初始化阶段,窗口准备阶段,消息循环和消息处理阶段,进程终止阶段,终止进程的运行(ExitProcess),Yes,No,主程序WinMain工作阶段,消息处理过程WndProc,代码段部分,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.szCNamedbTest_Class,0szMsgdb汇编语言编写Windows的基本结构,0szExitdb真的退出吗?,0szHelpdbThisisasimplewindowprogram,0.code;代码段部分start:invokeGetModuleHandle,NULL;程序的初始化阶段movhInstance,eaxinvokeGetCommandLinemovCmdline,eaxinvokeWinMain,hInstance,NULL,Cmdline,SW_SHOWDEFAULTinvokeExitProcess,eax;终止当前程序的运行,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.;子程序WinMain主要实现窗口类注册、创建窗口、显示窗口和消息的处理循环WinMainprochInst:DWord,hPrevInst:DWord,CmdLine:DWord,CmdShow:DWordLOCALwc:WNDCLASSEX;定义子程序局部变量LOCALmsg:MSG;填写结构WNDCLASSEX中的各字段数据movwc.cbSize,sizeofWNDCLASSEXmovwc.style,CS_HREDRAWorCS_VREDRAWorCS_BYTEALIGNWINDOWmovwc.lpfnWndProc,offsetWndProc;指定WndProc为其消息处理程序movwc.cbClsExtra,NULLmovwc.cbWndExtra,NULLmovebx,hInst;下面二指令实现wc.hInstancehInstmovwc.hInstance,bexmovwc.hbrBackground,COLOR_BTNFACE+1movwc.lpszMenuName,NULLmovwc.lpszClassName,offsetszCName,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.;装入窗口图标文件,并把其句柄置入窗口结构中的相应字段invokeLoadImage,NULL,addrszIcon,IMAGE_ICON,0,0,LR_LOADFROMFILEmovwc.hIcon,eax;装入窗口光标(或函数LoadCursor),并把其句柄置入窗口结构中的相应字段invokeLoadImage,NULL,addrszCursor,MAGE_CURSOR,0,0,LR_LOADFROMFILEmovwc.hCursor,eaxmovwc.hIconSm,0invokeRegisterClassEx,addrwc;用结构变量wc中信息注册窗口类;用窗口类szCName来创建实例化窗口,位置(360,310),(宽度,高度)=(300,150)invokeCreateWindowEx,WS_EX_LEFT,addrszCName,addrszCaption,WS_OVERLAPPEDWINDOW,360,310,300,150,NULL,NULL,hInst,NULL,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.movhWnd,eaxinvokeLoadMenu,hInst,600;装入窗口菜单invokeSetMenu,hWnd,eax;设置窗口菜单invokeShowWindow,hWnd,SW_SHOWNORMAL;显示窗口invokeUpdateWindow,hWnd;刷新窗口;窗口消息处理:用循环来处理各类窗口消息,直到接受消息WM_QUIT为止.repeatinvokeGetMessage,addrmsg,NULL,0,0.break.ifeax=0invokeTranslateMessage,addrmsginvokeDispatchMessage,addrmsg.until0retWinMainendp,第13章Windows应用程序的编程,例13.4一个简单而又完整的Windows应用程序.;子程序WndProc是应用程序功能的主要实现者,它根据不同的窗口消息作相应的处理WndProcprochWin:DWord,uMsg:DWord,wParam:DWord,lParam:DWordLOCALhDC:DWordLOCALPs:PAINTSTRUCTLOCALstRect:RECTswitchuMsgcaseWM_COMMAND;=窗口菜单命令的处理起点=.ifwParam=1000;Exit菜单项的ID,见13.3.3节中的图13.11invokeSendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL.elseifwParam=1900;About菜单项的IDinvokeMessageBox,hWin,addrszHelp,addrszCaption,MB_OK.endif;=窗口菜单命令的处理结束=,例13.4一个简单而又完整的Windows应用程序.caseWM_PAINTinvokeBeginPaint,hWin,addrPsmovhDC,eaxinvokeSetBkMode,hDC,TRANSPARENTinvokeGetClientRect,hWnd,addrstRectinvokeDrawText,hDC,addrszMsg,-1,addrstRect,DT_CENTERorDT_VCENTERorDT_SINGLELINEinvokeEndPaint,hWin,addrPsxoreax,eaxretcaseWM_CLOSEinvokeMessageBox,hWin,addrszExit,addrszCaption,MB_YESNOorMB_ICONQUESTIONorMB_DEFBUTTON2.ifeax=IDNOxoreax,eaxret.endifcaseWM_DESTROYinvokePostQuitMessage,NULLxoreax,eaxretendswinvokeDefWindowProc,hWin,uMsg,wParam,lParam;缺省的消息处理程序retWndProcendpendstart,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.1Windows程序的基本结构例13.4一个简单而又完整的Windows应用程序.上例程序中的窗口含有图标、系统按钮(最小化、最大化和关闭)和窗口菜单(File和Help)等元素.在结束程序运行前,程序将给一次确认机会,并且设置其默认的焦点按钮为“否”.该程序的运行画面和退出前的确认画面如图13.8所示.,第13章Windows应用程序的编程,表13.5Windows应用程序常用的API函数及其相关信息,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.2程序的初始化阶段程序初始化阶段的工作是为后续编程作必要的准备,它所做的工作有:获取当前模块的句柄和命令行首地址.前者是必不可少的,因为在后续编程过程中需要使用它.后者是可选的,如果当前的应用程序不接受(或不处理)命令行参数,那么可不必获取命令行参数的首地址信息.句柄是Window应用程序的一个重要概念,它对应一个被装入内存的EXE或DLL文件,系统对每个被装入的执行文件用一个唯一的句柄来标识.在编写Windows应用程序时,一般都会使用一系列API函数,其中一些API函数都需要用模块句柄来作为其调用参数,所以,通常在程序的开始就先取得当前模块的句柄并把它保存在一个全局变量之中,这样在随后的编程过程中就可直接使用该句柄.,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.2程序的初始化阶段下面程序段是在Windows应用程序在代码开始时的一般写法.datahInstancedd0;定义变量用来保存当前模块的句柄CmdLinedd0;定义变量用来保存命令行首地址.codestart:invokeGetModuleHandle,NULL;获取当前程序的句柄movhInstance,eax;把句柄保存到变量hInstanceinvokeGetCommandLine;获取命令行首地址movCmdLine,eax;把命令行首地址保存到变量CmdLine,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段窗口是Windows程序的一个重要元素,也是进行“人机交互”的主要载体,用户的各类操作都可通过各种窗口操作来完成.Windows系统根据不同的需求设计出多种窗口风格,程序员可根据需要组合各种窗口风格,从而使Windows程序呈现出丰富多彩的运行界面.窗口类信息一般包括窗口图标、光标形状、窗口风格、模块句柄、窗口背景色和处理窗口消息的过程(子程序)等,它是以结构WNDCLASSEX中各字段的数据形式保存中内存之中.在注册窗口类之前,程序员需根据具体需求向该结构各字段填入适当的数据,结构WNDCLASSEX中各字段名及其含义如表13.6所示.,第13章Windows应用程序的编程,13.3.3窗口的准备阶段表13.6WNDCLASSEX的结构信息及其含义,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段假设程序员想用MSN的图标为窗口类图标,那么可编写下面语句来实现.dataszIcondbc:windowsServicePackFilesi386msnms.ico,0wcWNDCLASSEX.codeinvokeLoadImage,NULL,addrszIcon,IMAGE_ICON,0,0,LR_LOADFROMFILEmovwc.hIcon,eax,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段上面程序段的运行效果如图13.9所示.由此可见,程序员可利用图标设计软件设计出自己的程序图标,并把它以文件的形式保存起来,以便在随后的程序设计过程中加以运用.下面是装入“手形”鼠标的函数调用形式.invokeLoadCursor,NULL,IDC_HAND,窗口图标,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段在Windows系统中存有动画鼠标文件,其中之一是一个“奔腾的小红马”.如果程序用它来做光标,那么可用装入图像文件的方式来实现该目标.dataszCursordbc:windowscursorshorse.ani,0wcWNDCLASSEX.codeinvokeLoadImage,NULL,addrszCursor,IMAGE_CURSOR,0,0,LR_LOADFROMFILEmovwc.hCursor,eax,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段当窗口结构各字段填入适当的信息后即可向Windows系统注册该窗口类,可用函数RegisterClassEx来注册窗口类,为后面创建该类窗口作准备.在设计Windows应用程序时,除需要编写必要的代码外,有时还需要设计资源文件.在设计资源文件时,可添加的资源有图标、菜单和快捷键等资源,并可指定资源的标识符,如可自行设定菜单标识符为600(如图13.10中的600).资源设计和菜单设计的局部画面如图13.10和图13.11所示.,菜单资源标识,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段窗口菜单是驱动窗口功能的一种重要方式,有些窗口,尤其是主窗口,通常都会含有一个窗口菜单栏.程序员可通过下面二步来实现窗口与菜单资源之间联系:装入模块句柄为hInst中标识符为ID_MENU的菜单资源,获取的菜单句柄在eax之中;将获取的菜单句柄与窗口之间建立关联,使该窗口具有相应的菜单.invokeLoadMenu,hInst,ID_MENU;装入菜单资源invokeSetMenu,hWnd,eax;菜单句柄与窗口之间建立关联,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段快捷键是另一种非常有效的用户操作手段.用户虽然可用鼠标或菜单功能很好地操作Windows界面,但灵活地运用快捷键将会更加方便地进行各种操作,而且一些常用的快捷键及其功能也被绝大多数Windows用户所熟记,如A(全选)、C(复制)和V(粘贴)等.所以,在设计Windows应用程序时,用适当的功能键或组合键来操作窗口功能也是程序员需要考虑的问题之一.假设Windows应用程序有如图13.12所示的快捷键资源,那么可用下面代码装入之.,快捷键资源标识,第13章Windows应用程序的编程,13.3.3窗口的准备阶段.dataszAccedbShowDib2,0hAccedd?.codeinvokeLoadAccelerators,hInst,addrszAcce;装入模块句柄hInst的快捷键movhAcce,eax;保存当前快捷键句柄;简单修改窗口消息处理循环.repeatinvokeGetMessage,addrmsg,NULL,0,0.break.ifeax=0invokeTranslateAccelerator,hwnd,hAccel,addrmsg.ifeax=0invokeTranslateMessage,addrmsginvokeDispatchMessage,addrmsg.endif.until0,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段在设计快捷键资源时需确定每个快捷键的信息,一个快捷键信息包含该快捷键的ID(标识号)、Modifier(组合键)、Key(按键)和Type(类型),其中:ID快捷键的标识符,可从输入一个标识符,也可从下拉框中选择一个标识符.Modifier快捷键的组合方式,它只可从其下拉框中进行选择,其值为None(非组合键)、Alt、Ctrl、Shift、Alt+Shift、Ctrl+Alt、Ctrl+Shift或Ctrl+Alt+Shift之一.Key快捷键的按键,它可以是任意一个ASCII码键,或从下拉框中选择一个虚拟键.Type快捷键的类型,它只可从其下拉框中进行选择,其值为VirtKey(虚拟键默认类型)或ASCII码.,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段快捷键资源的设计画面和快捷键资源SHOWDIB2的快捷键列表如图13.13所示.,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.3窗口的准备阶段在菜单资源的设计画面中,在菜单输入框中输入:(2)对窗口消息只作其个性化的消息处理;(3)对窗口消息除进行其个性化的消息处理外,还使用其缺省的消息处理.在通常情况下,程序员会把消息处理部分单独编写成一个子程序的形式,该子程序处理窗口消息的逻辑框图如图13.16所示,其原型定义如下:WndProcPROTOhWin:DWord,uMsg:DWord,wParam:DWord,lParam:DWord其中:hWin为窗口句柄,uMsg为待处理的消息,wParam和lParam是窗口消息的附加消息.,第13章Windows应用程序的编程,待处理的操作消息uMsg,菜单消息WM_COMMAND?,No,创建消息WM_CREATE?,No,绘画消息WM_PAINT?,No,关闭消息WM_CLOSE?,No,销毁消息WM_DESTROY?,No,Yes,缺省的消息处理过程DefWindowProc,PostQuitMessage,处理过程,做相应的绘画处理,创建各种需要的控件,分类处理菜单项、快捷键和各类按钮,消息处理过程结束,分类依次判断其他消息?,No,相应的消息处理,Yes,Yes,Yes,Yes,Yes,第13章Windows应用程序的编程,13.3Windows程序的结构13.3.5消息处理阶段在编写Windows应用程序时,程序员所编写的消息处理过程WndProc只考虑当前窗口的某些特定消息,这样可达到完成其相应功能的目的,但对窗口的一些基本消息,如窗口移动、改变窗口大小等消息,用户的消息处理过程WndProc一般可不作任何处理.为了确保每个窗口消息都被处理,系统提供了一个缺省的消息处理函数DefWindowProc,该函数提供了窗口消息的最基本的处理方式,消息处理过程WndProc不处理的消息都可由该函数来处理.,第13章Windows应用程序的编程,13.4Windows应用程序13.4.1按钮控件的应用按钮是窗口中常用的一种控件,按照按钮的显示形式可分:图标按钮、BMP按钮和普通按钮.前二个是图像按钮,后一个是文本按钮.Windows系统把控件看成是一个特殊的窗口,创建控件和创建窗口是同一个函数,所不同的是它们调用函数的参数有所不同而已.例13.5假设资源文件中有如图13.17中的四个图像:2个图标(a和b)和2个BMP图像(c和d),试编写窗口应用程序,在窗口中创建三个按钮:图标按钮、BMP按钮和普通按钮.图标按钮使用图标(a和b),BMP按钮使用BMP图像(c和d),且“按下”和“弹起”使用不同的图像.,第13章Windows应用程序的编程,13.4.1按钮控件的应用解:.386.modelflat,stdcalloptioncasemap:noneincludemasm32includewindows.incincludemasm32macrosmacros.asmincludemasm32includemasm32.incincludemasm32includeuser32.incincludemasm32includekernel32.incincludelibmasm32libmasm32.libincludelibmasm32libuser32.libincludelibmasm32libkernel32.libWinMainPROTO:DWord,:DWord,:DWord,:DWordWndProcPROTO:DWord,:DWord,:DWord,:DWord,第13章Windows应用程序的编程,13.4.1按钮控件的应用解:ID_ICONEQU1;3个图标资源,第一个作窗口图标ID_ICON1EQU2;后二个作按钮图标ID_ICON2EQU3ID_BMP1EQU10;2个BMP资源ID_BMP2EQU11ID_ICONBTNEQU400;3个按钮标识符ID_BMPBTNEQU401ID_PUSHBTNEQU402.constszCaptiondbIcon,BmpandPushButtons
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年度“安全生产事故隐患排查”知识竞赛模拟题库及答案详解【有一套】
- 2024-2025学年度法律职业资格考试每日一练试卷附参考答案详解(满分必刷)
- 2024-2025学年反射疗法师大赛理论高分题库完整附答案详解
- 软件开发项目经理训练指南
- 2024-2025学年南京特殊教育师范学院单招《语文》复习提分资料及完整答案详解1套
- 2024-2025学年度电工复习提分资料含完整答案详解(夺冠)
- 2024-2025学年度护士资格证通关题库【培优B卷】附答案详解
- 2024-2025学年广西英华国际职业学院妇产护理期末考试黑钻押题含完整答案详解(名校卷)
- 2024-2025学年度收银审核员试题预测试卷【重点】附答案详解
- 2026中国人寿招聘面试题及答案
- 教师信教排查情况自查报告
- 肿瘤内科叙事护理实践体系
- 货币银行学教材
- 《星级酒店装饰装修施工组织设计》
- 截瘫康复患者的护理查房
- 网球运动的损伤与预防
- 《经典常谈》每章习题及答案
- 盾构施工的安全防范措施
- 供应链管理平台协议书(2篇)
- 《淞沪会战》课件
- 《山桐子产业介绍》课件
评论
0/150
提交评论