C++面向对象程序设计教学PPT10

上传人:pu****.1 文档编号:567943561 上传时间:2024-07-22 格式:PPT 页数:90 大小:1.41MB
返回 下载 相关 举报
C++面向对象程序设计教学PPT10_第1页
第1页 / 共90页
C++面向对象程序设计教学PPT10_第2页
第2页 / 共90页
C++面向对象程序设计教学PPT10_第3页
第3页 / 共90页
C++面向对象程序设计教学PPT10_第4页
第4页 / 共90页
C++面向对象程序设计教学PPT10_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《C++面向对象程序设计教学PPT10》由会员分享,可在线阅读,更多相关《C++面向对象程序设计教学PPT10(90页珍藏版)》请在金锄头文库上搜索。

1、第第10章章 C+ Windows程序设计基础程序设计基础 Windows系统是一个基于视窗的消息驱动系统,即使功能大系统是一个基于视窗的消息驱动系统,即使功能大异的异的Windows程序都有比较规范统一的程序界面,如窗口、程序都有比较规范统一的程序界面,如窗口、菜单、工具条、对话框等。菜单、工具条、对话框等。 Windows程序的设计其实比较程序的设计其实比较规范,但若不了解规范,但若不了解Windows程序的基本结构,程序调度的基程序的基本结构,程序调度的基本方法(即消息驱动的基本原理),以及每个程序都会用到本方法(即消息驱动的基本原理),以及每个程序都会用到的基本数据结构,也很难编写出有

2、用的的基本数据结构,也很难编写出有用的Windows程序来。程序来。之所以在本章介绍之所以在本章介绍API程序,就是基于上述考虑而设计的,程序,就是基于上述考虑而设计的,尽管尽管API程序设计在实际编程过程中已越来越少用了,但它程序设计在实际编程过程中已越来越少用了,但它却是理解却是理解Windows程序设计基本原理的最佳捷径,因为所有程序设计基本原理的最佳捷径,因为所有Windows程序的结构和执行过程最终大同于程序的结构和执行过程最终大同于API程序。在此程序。在此基础上学习基础上学习MFC及其它在及其它在Windows程序设计语言如程序设计语言如JAVA,都是大有帮助的!都是大有帮助的!

3、“磨刀不误砍柴功!磨刀不误砍柴功!”,不是吗?,不是吗?10.1 Windows程序设计基础程序设计基础1.Windows系统的特点系统的特点标准的用户界面多任务设备独立性动态链接强大的内存管理10.1 Windows程序设计基础程序设计基础2.基本术语窗口(Window)由句柄唯一标识对话框(Dialog)人机交互图标(Icon)代表某一项操作或程序的图符位图(Bitmap)用位模式形成的图像菜单(Menu)命令工具栏(ToolBar)常用的菜单项状态栏(StateBar)操作状态或操作提示10.1.1 窗口窗口窗口是Windows程序的基本单元,Windows程序的运行过程就是窗口内部、窗

4、口之间及窗口与用户之间的信息交换过程。窗口通常包括菜单、工具条、滚动条、状态栏、命令按钮、对话框等元素。10.1.2 事件驱动和消息响应事件驱动和消息响应1. 事件事件事件是指人们应用计算机的过程中发生的操作,如按下键盘上的某个按键、移动鼠标、单击鼠标左键、移动窗口及选择程序菜单等操作都是事件。2、事件驱动、事件驱动每发生一个事件,就会产生一个与之对应的特定消息,该消息会被Windows系统捕获,然后将通过此消息调用执行与之对应的程序代码,实现相应的程序功能。因为从事件发生到相应程序代码被调用执行都是通过消息来实现的,因此事件驱动也常被称为消息驱动10.1.2 事件驱动和消息响应事件驱动和消息

5、响应3、消息队列、消息队列用于存放消息的队列,消息系统由Windows系统自动建立和维护。Windows消息队列的类型消息队列的类型系统消息队列:由Windows系统维护管理的消息队列,每当有消息发生时,该消息将首先被存入系统消息队列。应用程序消息队列:应用程序消息队列:Windows系统会为每个应用系统会为每个应用程序建立一个独立的消息队列,用于存放该应用程序建立一个独立的消息队列,用于存放该应用程序的消息。程序的消息。10.1.2 事件驱动和消息响应事件驱动和消息响应4、消息循环、消息循环每个应用程序都有一个循环机构,该循环机构每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自

6、身的消息队列,如则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称消息处理代码,这个处理消息的循环机构称为消息循环。为消息循环。10.1.2 事件驱动和消息响应事件驱动和消息响应4、消息循环、消息循环每个应用程序都有一个循环机构,该循环机构每个应用程序都有一个循环机构,该循环机构则不断地重复查看程序自身的消息队列,如则不断地重复查看程序自身的消息队列,如果队列中有消息,就将其取出并执行相应的果队列中有消息,就将其取出并执行相应的消息处理代码,这个处理消息的循环机构称消息处理代码,这个处理消息的

7、循环机构称为消息循环。为消息循环。10.1.2 事件驱动和消息响应事件驱动和消息响应5、Windows程序调度的基本原理程序调度的基本原理每个每个Windows程序启动后,就等待用户在其窗口中进程序启动后,就等待用户在其窗口中进行操作。每个操作会引发一个事件,就会产生一个行操作。每个操作会引发一个事件,就会产生一个与之对应的特定消息。该消息会被与之对应的特定消息。该消息会被Windows系统捕系统捕获。获。Windows系统对捕获的消息进行分析后,会将系统对捕获的消息进行分析后,会将消息传递给产生它的应用程序的消息队列,每个应消息传递给产生它的应用程序的消息队列,每个应用程序的消息循环机构不断

8、地重复查看它自已的消用程序的消息循环机构不断地重复查看它自已的消息队列,如果队列中有消息,就将其取出并执行相息队列,如果队列中有消息,就将其取出并执行相应的消息处理代码,应的消息处理代码,如果队列中没有消息就等待,当队列中有消息时就又处理它,如此循环往复,直至程序结束。10.1.2 事件驱动和消息响应事件驱动和消息响应6、事件驱动及消息循环的基本原理10.1.2 事件驱动和消息响应事件驱动和消息响应8、DOS和Windows程序执行方式对比10.1.3Windows程序的构成1、Windows程序的组成程序的组成程序代码程序代码是程序的主体,用于实现程序的功能资源Windows程序具有标准规范

9、的应用程序界面,每个Windows程序常常包含了许多相同的组成元素,如菜单、对话框、工具栏、应用程序图标、鼠标光标、程序版本信息等,这些组成元素被Windows从程序代码中独立出来,并以各种不同扩展名的文件形式存在,如.ico(图标)、.bmp(位图)、.cur(光标)等,Windows系统称之为资源资源则可以在需要时才通过相关命令资源则可以在需要时才通过相关命令加载加载到程序中。到程序中。.libC runtimeDll import.RC资源编译器资源编译器.DLGDialog Editor*.obj*.exe.res.DEF资源连接器资源连接器Image EditorFont Edito

10、r.BMP.ICO.CUR.FON.h.c/cppc编译器编译器2、Window程序的编译链接过程10.1.4 VC+的的Windows程序设计方法程序设计方法1API程序设计程序设计API即ApplicationProgrammingInterface(应用程序编程接口),它是Windows操作系统和Windows应用程序之间的标准接口,在应用程序中可以通过API访问Windows提供的各种函数、宏及数据结构。API函数保存在一些动态链接库中,每个Windows程序都要用到的动态链接库有USER32.Dll、GDI32.Dll、KERNEL32.Dll。API程序设计就是直接利用Window

11、s系统提供的API函数,编写能够在Windows系统中运行的程序。10.1.4 VC+的的Windows程序设计方法程序设计方法2MFC程序设计程序设计MFC是是Microsoft Foundation Classes的的缩缩写写,即即微微软软基基础础类类库库。MFC是是建建立立在在API基基础础上上的的C+类类库库,它它对对Windows提提供供的的API函函数数、数数据据结结构构、各各种种控控件件按按功功能能进进行行了了分分类类,利利用用面面向向对对象象技技术术将将它它们们封封装在不同的类中,并通过继承将这些类组织在一起。装在不同的类中,并通过继承将这些类组织在一起。MFC不不仅仅把把AP

12、I函函数数封封装装成成了了易易于于使使用用的的类类,而而且且还还提提供供了了建建立立Windows应应用用程程序序的的框框架架结结构构,以以及及建建立立应应用用程程序序的的各各种种组组件件,简简化化了了Windows程程序序设设计的难度计的难度1. 句柄句柄句柄是整个句柄是整个Windows编程的基础。一个句柄编程的基础。一个句柄是指是指Windows使用的一个唯一的整数值,是使用的一个唯一的整数值,是一个一个4字长(字长(32位无符号整数)位无符号整数)的数值,用的数值,用于标识应用程序中不同的对象和同类对象中于标识应用程序中不同的对象和同类对象中不同的实例。不同的实例。如标识一个窗口、按钮

13、、图标、滚动条、输如标识一个窗口、按钮、图标、滚动条、输入入/输出设备、控件或文件等。输出设备、控件或文件等。应用程序通过句柄能够访问相应的对象信息。应用程序通过句柄能够访问相应的对象信息。10.2 Windows程序设计的常用数据结构程序设计的常用数据结构常用的句柄类型HWND 标识窗口句柄HINSTANCE标识当前实例句柄HCURSOR标识光标句柄HFONT标识字体句柄HPEN标识画笔句柄HBRUSH标识画刷句柄HDC标识设备环境句柄HBITMAP标识位图句柄HICON标识图标句柄HMENU标识菜单句柄HFILE标识文件句柄10.2 Windows程序设计的常用数据结构程序设计的常用数据结

14、构关键字关键字类型类型等价于等价于BOOLBOOL逻辑类型逻辑类型intintBOOLEAN BOOLEAN 逻辑逻辑BYTEBYTEBYTEBYTE字节字节unsingedunsinged char charCHARCHAR字符字符charcharDOUBLE DOUBLE 双精度双精度doubledoubleDWORD DWORD 双字双字unsigned longunsigned longFLOATFLOAT浮点数浮点数floatfloatHANDLEHANDLE句柄句柄10.2.2 常用常用数据类型数据类型INTINT整数整数intintLONGLONG长整数长整数longlongSH

15、ORTSHORT短整数短整数shortshortUCHARUCHAR无符号字符无符号字符unsingedunsinged char charUINTUINT无符号整数无符号整数unsingedunsinged intintULONGULONG无符号长整数无符号长整数unsigned longunsigned longUSHORTUSHORT无符号短整数无符号短整数unsigendunsigend short shortVOIDVOIDvoidvoidWCHARWCHAR双字节码双字节码unsigned shortunsigned shortWCHAR_TWCHAR_T双字节码双字节码unsig

16、ned shortunsigned shortWORDWORD字字unsigned shortunsigned shortWPARAM消息参数消息参数UINTLPARAM消息参数消息参数LONGLRESULT消息返回值消息返回值 LONGHINSTANCE实例句柄实例句柄unsigned longHWAND窗口句柄窗口句柄unsigned longHDC设备环境句柄设备环境句柄unsigned longTCHAR字符字符charLPSTR字符指针字符指针char *LPCSTR常量字符指针常量字符指针const char*LPTSTR字符指针字符指针TCHAR *LPVOID无类型指针无类型指

17、针void *LPCVOID无类型长指针无类型长指针const void *(1)、坐标结构typedefstructtagPOINTLONGx;LONGy;POINT;在在MFC中还有一个类中还有一个类Cpoint,与,与POINT结构近似,但它有许多成员函数。结构近似,但它有许多成员函数。(2)、长、宽尺寸结构:CSIZE,Csize;typedefstructtagSIZEintcx;intcy;SIZE;10.2.3点和矩形区域(3)、记录矩形区域结构RECT和CrecttypedefstructtagRECTLONGleft;LONGtop;LONGright;LONGbottom;

18、RECT;在在MFC中中Crect与此类似,但有成员函数。与此类似,但有成员函数。LPRECT为指针为指针RECT类型的常数指针。类型的常数指针。(4)、颜色COLORREF32-bitvalueusedtospecifyanRGBcolor.例:COLORREFRGB(BYTEbRed,BYTEbGreen,BYTEBblue);10.2.4 窗口结构窗口结构typedefstruct_WNDCLASSUINTstyle;/窗口类型窗口类型WNDPROClpfnWndProc;/窗口函数指针窗口函数指针intcbClsExtra;/为类结构的预留额外空为类结构的预留额外空间间intcbWnd

19、Extra;/为窗口结构预留额外空为窗口结构预留额外空间间HANDLEhInstance;/窗口类的应用实例句柄窗口类的应用实例句柄HICONhIcon;/图标句柄图标句柄HCURSORhCursor;/窗口类的光标窗口类的光标HBRUSHhbrBackground;/窗口类的背景刷窗口类的背景刷LPCTSTRlpszMenuName;/菜单资源名菜单资源名LPCTSTRlpszClassName;/窗口类名窗口类名WNDCLASS;10.2.4 窗口结构窗口结构WNDCLASS中的style代表窗口类型,可取下面的值:WS_CHILD子窗口(不能与WS_POPUP同时使用)WS_BORDER

20、带边框的窗口WS_CAPTION带标题栏的窗口WS_HSCROLL带有水平滚动条的窗口WS_MAXIMIZE最大尺寸的窗口WS_MAXIMIZEBOX带最大化框的窗口WS_MINIMIZE最小尺寸的窗口WS_MINIMIZEBOX带最小化框的窗口WS_OVERLAPPED带边框和标题栏的窗口WS_OVERLAPPEDWINDOW带边框、标题栏、系统菜单及最大、最小化框的窗口WS_POPUP弹出式窗口WS_POPUPWINDOW带边框和系统菜单的弹出式窗口WS_SYSMENU带系统菜单的窗口WS_VSCROLL带垂直滚动条的窗口1 1、消息结构:、消息结构:MSGMSGtypedefstruct

21、tagMSGHWND hwnd;/消息发向的窗口句柄消息发向的窗口句柄UINT message;/消息标识符消息标识符,WPARAMwParam;/16位的消息参数,值因消息位的消息参数,值因消息异异LPARAMlParam;/32位的消息参数,值因消息位的消息参数,值因消息异异DWORD time; /消息放入消息队列的时间消息放入消息队列的时间POINT pt;/消息放入消息队列的鼠标位消息放入消息队列的鼠标位置置。MSG;说明:说明:WPARAM含义和数值因消息不同而不同含义和数值因消息不同而不同比如:键盘消息和鼠标消息所对应的比如:键盘消息和鼠标消息所对应的WPARAM消息所代表的消息

22、是不消息所代表的消息是不同的。同的。10.2.5 消息消息10.2.5 消息消息2、MSG中的域说明中的域说明hwnd是一个窗口句柄,用于标识消息发向的窗口。time用于保存消息放进消息队列的时间,pt用于保存将消息放入消息队列时的鼠标位置。message是消息标识符,它是一个32位的无符号整数。Windows中的每条消息都有一个对应的消息标识符,这些标识符是在windows.h中定义的3、消息的种类、消息的种类标准Windows消息除除WM_COMMAND外,所有以外,所有以WM_ 为前缀的为前缀的消息,由窗口和视图处理。消息,由窗口和视图处理。控制消息由控件和子窗口发给父窗口的消息。由控件

23、和子窗口发给父窗口的消息。命令消息来自用户接口对象。如:菜单、工具条和加速键来自用户接口对象。如:菜单、工具条和加速键等。等。10.2.5 消息消息10.2.5 消息消息4、常见消息前缀的含义、常见消息前缀的含义BM表示按钮控制消息CB组合框控制消息EM编辑框控制消息LB列表控制消息SBM滚动条控制消息WM窗口消息10.2.5 消息消息5、Windows常用鼠标消息常用鼠标消息WM_LBUTTONDBLCLKWM_LBUTTONDOWNWM_LBUTTONUPWM_MBUTTONDBLCLKWM_MBUTTONDOWNWM_MBUTTONUPWM_RBUTTONDBLCLKWM_RBUTTON

24、DOWNWM_RBUTTONUP10.2.5 消息消息6、Windows常用键盘消息常用键盘消息WM_KEYUPWM_KEYDOWN按下非系统键时产生此消息,系统键是指实现系统操作的组合键,如Alt和F1相结合的按钮键。附加参数wParam为按下键的虚拟键码,lParam记录按钮的重复次数、先前状态等。WM_KEYUP是释放按键时的键盘消息,其含义同WM_KEYDOWN。WM_CHAR按下非系统键时产生的消息,附加参数wParam为按键的ASCII码,lparam同前。7、其它常用、其它常用Windows常用消息常用消息WM_CREATECreateWindow函数发生的消息。WM_CLOSE

25、关闭窗口时产生的消息,如有子窗口,也一起删除。WM_DESTROY关闭窗口时产生的消息WM_PAINThdc=(HDC)wParam;/发生用户区域移动或显示事件、用户窗口改变大小的事件、程序通过流动条滚动窗口,覆盖在窗口上面的其它对象(如菜单)移开时,都会产生此消息!10.2.5 消息消息8、消息的产生、消息的产生用户产生消息Windows本身产生消息应用程序本身产生消息其他应用程序产生消息9、消息的传递、消息的传递Windows系统有一个存放消息的队列,每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。应用程序则从自身的队列中

26、获取消息并进行处理。10.2.5 消息消息10、消息的处理通常每个Windows应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件。每个窗口至少有一个窗口函数,负责处理该窗口的所有消息。10.2.5 消息消息1、Windows标识符常用标识符常用 命名规则命名规则函数命名规则函数命名规则函数名函数名 = 动词动词 + 名词名词动词和名词的第一个字母必须大写动词和名词的第一个字母必须大写例例 GetMessage变量命名规则变量命名规则小写字母前缀表示变量的类型小写字母前缀表示变量的类型,其余其余 的部分描述变的部分描述变量的功能量的功能例例 nCount匈牙利命名

27、法匈牙利命名法变量名以小写字母或代表数据类型的小写字母开头变量名以小写字母或代表数据类型的小写字母开头.Eg: szCmdLine 补充补充: Windows程序的名字程序的名字前缀前缀代表的数据类型代表的数据类型cchar or WCHAR or TCHARbyBYTE (unsigned char)nshortiintx, yint used as x-coordinate or y-coordinatecx, cyint used as x or y length; c stands for countb or fBOOL (int); f stands for flagwWORD (u

28、nsigned short)lLONG (long)dwDWORD (unsigned long)fnfunctionsstringszstring terminated by 0 characterhhandleppointer2、Windows程序常见名字前缀的含义程序常见名字前缀的含义10.3Windows程序的基本结构1、简单的、简单的Windows程序至少包含两个函数程序至少包含两个函数:WinMain():必有且仅有一个。是程序执行的入口点,类似于C程序中的main函数窗口函数窗口函数:每个窗口对应一个窗口函数,以响应该程序窗口中发生的事件消息。2、WinMain ( )函数需完成

29、的功能函数需完成的功能定义窗口类注册窗口类建立窗口类的窗口显示窗口运行消息循环10.3Windows程序的基本结构3、Windows程序的执行逻辑程序的执行逻辑Windows系统首先为该程序建立必备的程序环境,如定义并初始化一些全局变量,接下来就寻找并进入WinMain函数。WinMain是Window程序的入口点,由它控制程序的执行流程。WinMain函数依次完成以下工作:调用API函数定义并注册窗口类,创建程序窗口,显示窗口,建立消息循环,等待用户操作程序窗口。用户在程序窗口中所作的每件事情都会产生一个消息,该消息会被Windows传递到该程序的消息队列中。WinMain中的消息循环会不断

30、地从本程序的消息队列中获取消息,并将其传递给该窗口的窗口处理函数,由窗口处理函数对消息进行处理,实现相应的程序功能。10.3.2Win32Application程序设计在在Miscrosoft Visual C+中的中的API程序设计方法程序设计方法一般的编程方法是先用VC+的Win32Application向导建立一个Windows应用程序的框架,然后将它修改成自己的程序,并根据需要添加一些头文件、源程序文件及资源文件。【例10-1】在VC+6.0环境下设计一个简单的WindowsAPI程序,该程序在窗口中显示字符串Hellow,APIProgramming!。10.3.2Win32Appl

31、ication程序设计编程过程如下:(1)启动VC+6.0,选择菜单“文件|新建”,在弹出的“新建”对话框中选择“工程”标签页,如图所示。10.3.2Win32Application程序设计(2)选中“工程”对话框中的“Win32Application”列表项,并在“位置”编辑框中指定本项目建立的磁盘目录,然后在“工程”编辑框中输入项目文件的名字。(3)单击“确定”按钮,并在弹出的对话框中选中“Anemptyproject.”单选项,然后单击“完成”按钮。最后将得到如图10-7(a)所示的空项目文件窗口。(4)选择菜单“文件|新建”,然后在弹出的对话框中选择“文件”标签,并选择列表中的“C+S

32、ourceFile”项目,然后在“文件”编辑框中输入源程序文件名“HellApi”,如图10-7(b)所示。输入完成后,单击“结束”按钮。10.3.2Win32Application程序设计10.3.2Win32Application程序设计(5)打开目录C:dkHellApi,在该目录中可以看到以下文件名:HellApi.cpp、HellApi.dsp、HellApi.dsw、HellApi.ncb、HellApi.opt,这些文件就是在前面的操作过程产生的。(6)在HellApi.cpp中输入下面的程序代码。HellApi.cpp#includeLRESULTCALLBACKWndProc

33、(HWND,UINT,WPARAM,LPARAM);intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,int iCmdShow)staticTCHARszAppName=TEXT(HelloWin);HWNDhwnd;MSGmsg;WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc ;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndcla

34、ss.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if (!RegisterClass (&wndclass) MessageBox (NULL, TEXT (This program

35、requires Windows NT!), szAppName, MB_ICONERROR) ; return 0 ; 注册窗口类注册窗口类定义定义窗口窗口的属的属性,性,如大如大小、小、宽度,宽度,前景前景色等色等 hwnd = CreateWindow(szAppName,/用于建立窗口的类名用于建立窗口的类名 TEXT (The Hello Program), / 窗口标题窗口标题 WS_OVERLAPPEDWINDOW, / 窗口类型窗口类型 CW_USEDEFAULT,/ 窗口左上角窗口左上角X坐标为默认值坐标为默认值 CW_USEDEFAULT,/ 窗口左上角窗口左上角Y坐标为默

36、认值坐标为默认值 CW_USEDEFAULT,/ 窗口宽度为默认值窗口宽度为默认值 CW_USEDEFAULT,/ 窗口高度为默认值窗口高度为默认值 NULL,/ 该窗口没有父窗口该窗口没有父窗口 NULL, / 该窗口没有菜单该窗口没有菜单 hInstance,/ 创建本窗口的程序句柄创建本窗口的程序句柄 NULL) ;/ 系统保留参数系统保留参数 ShowWindow(hwnd,iCmdShow) ; /显示窗口,显示窗口,hwnd代表上面建立的窗口代表上面建立的窗口 UpdateWindow(hwnd) ;/更新窗口,绘制窗口客户区更新窗口,绘制窗口客户区本段程序建立并显示一个窗口本段程

37、序建立并显示一个窗口while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);returnmsg.wParam;Windows程序程序的消息循环的消息循环LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)HDChdc;PAINTSTRUCTps;RECTrect;窗口处理函数,是窗口处理函数,是一个回调函数,每一个回调函数,每个应用程序至少有个应用程序至少有一个窗口处理函数,一个窗口处理函数,窗口函数的参数由窗口

38、函数的参数由Windows传递,这传递,这些参数是由事件消些参数是由事件消息产生的息产生的。switch(message)/消息处理case WM_CREATE:return0;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,Hello,WindowsAPI,-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return0; case WM_DESTROY:PostQuitMessage(0);return0;

39、returnDefWindowProc(hwnd,message,wParam,lParam);10.3.3Windows程序的控制流程所有所有Windows应用程序具有相同的程序结构和应用程序具有相同的程序结构和执行控制流程,步骤如下:执行控制流程,步骤如下:(1)创建全局变量(2)程序入口函数WinMain()函数接收控制(3)WinMain()登记窗口(4)WinMain()建立窗口(5)WinMain()进入消息循环(6)当窗口中有事件发生时,事件消息进入消息循环队列(7)windows操作系统分析消息,调用该窗口的窗口函数进行处理。(8)WinMain函数退出,程序终止。如下图所示如

40、下图所示WindowsAPI程序的控制程创建全局变量程序入口函数WinMain()函数接收控制WinMain()登记窗口WinMain()建立窗口WinMain()进入消息循环当窗口中有事件发生时,事件消息进入消息循环队列windows操作系统分析消息,调用该窗口的窗口函数进行处理。WinMain函数退出,程序终止。WinMain()登记窗口建立窗口消息循环Hello,WindowsAPI显示窗口程序出口:程序出口:WM_QUITWindows程序的控制流程程序的控制流程int WINAPI WinMain (hIns, hPrevI,.) MSG msg ; RegisterClass (&

41、wndclass) CreateWindow (.) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wParam ;LRESULT CALLBACK WndProc (hwnd, message, wParam, lParam) switch (message) case WM_CREATE: case WM_COMMAND: case

42、WM_LBUTTONDOWN: case WM_PAINT: case WM_CLOSE: case WM_DESTROY: return DefWindowProc (hwnd, message, wParam, lParam) ;Mouse DriverKeyboard DriversystemmessagequeueapplicationmessagequeueMessage from others windows postMessage()WindowsUsermoduteHELLWin.exe10.3.3Windows程序的控制流程接下来将对API程序的建立、执行流程进行进一步的剖析

43、。借此理解Windows程序的结构,事件驱动和消息循环的本质。DOS平台的C程序的入口点是main()函数,在WINDOW的C+程序的入口点是WinMain()函数。其定义形式为:intAPIENTRYWinMain(HINSTANCEhInstance,/HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)实例句柄,当程序在实例句柄,当程序在WINDOWS下下运行时,它唯一地标识该程序运行时,它唯一地标识该程序当程序在当程序在WINDOWS下有多个副本运下有多个副本运行时,它标识该程序的前一个副本行时,它标识该程序的前一个副本标识传给该程序的命

44、令行参数,近似于标识传给该程序的命令行参数,近似于main()函数的函数的char *argv 指针窗口在指针窗口在Window中的显示方式,其值中的显示方式,其值为为1-7,如:值,如:值1表示表示SW_SHOWNORMAL /窗口以常规显示窗口以常规显示见第见第321页表页表10-41、程序入口点入口点窗口总是在窗口类的基础上创建的,窗口类标识了处理窗口消息的窗口过程,这是非常重要的。记住:窗口总是在窗口类的基础上创建的,窗口类用于标处理窗口消息的窗口过程。在创建窗口之前,必须先调用RegisterClass函数登录一个窗口类,以后可以基于这个已登录的窗口创建多个窗口。只有程序的第一个实例

45、需要登录窗口类!例例10-1的登录窗口如下:2、注册窗口类窗口类WNDCLASS WNDCLASS wndclasswndclass ; ;wndclass.stylewndclass.style = = CS_HREDRAW | CS_VREDRAW ;CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProcwndclass.lpfnWndProc = = WndProcWndProc ; ; wndclass.cbClsExtrawndclass.cbClsExtra = = 0 ;0 ; wndclass.cbWndExtrawndclass.cbWn

46、dExtra = = 0 ;0 ; wndclass.hInstancewndclass.hInstance = = hInstancehInstance ; ; wndclass.hIconwndclass.hIcon = = LoadIconLoadIcon (NULL, IDI_APPLICATION) ; (NULL, IDI_APPLICATION) ; wndclass.hCursorwndclass.hCursor = = LoadCursorLoadCursor (NULL, IDC_ARROW) ; (NULL, IDC_ARROW) ; wndclass.hbrBackgr

47、oundwndclass.hbrBackground = = (HBRUSH) (HBRUSH) GetStockObjectGetStockObject (WHITE_BRUSH) ; (WHITE_BRUSH) ; wndclass.lpszMenuNamewndclass.lpszMenuName = = NULL ;NULL ; wndclass.lpszClassNamewndclass.lpszClassName = = szAppNameszAppName ; ; if (! if (!RegisterClassRegisterClass (& (&wndclasswndclas

48、s) ) MessageBoxMessageBox ( (NULL, “This program !, NULL, “This program !, szAppNameszAppName, MB_ICONERROR) ;, MB_ICONERROR) ; return 0 ; return 0 ; 发生在本窗口中发生在本窗口中的事件由的事件由WndProc处理,处理,这是这是WinMain与与窗口函数的窗口函数的关联!关联!3、创建、创建窗口窗口hwndhwnd = = CreateWindowCreateWindow ( (szAppNameszAppName, , / window cla

49、ss name/ window class name TEXT (The Hello Program), TEXT (The Hello Program), / window caption/ window caption WS_OVERLAPPEDWINDOW, WS_OVERLAPPEDWINDOW, / window style/ window style CW_USEDEFAULT, CW_USEDEFAULT, / initial x position/ initial x position CW_USEDEFAULT, CW_USEDEFAULT, / initial y posi

50、tion/ initial y position CW_USEDEFAULT, CW_USEDEFAULT, / initial x size/ initial x size CW_USEDEFAULT, CW_USEDEFAULT, / initial y size/ initial y size NULL, NULL, / parent window handle/ parent window handle NULL, NULL, / window menu handle/ window menu handle hInstancehInstance, , / program instanc

51、e handle/ program instance handle NULL NULL) ; ) ; / creation parameters/ creation parameters if (! if (!hWndhWnd) return FALSE; ) return FALSE; / /建立窗口失败建立窗口失败 4、显示、显示窗口窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);hWnd是前面创是前面创建的窗口的句柄建的窗口的句柄nCmdShow是窗口显示的方式,是窗口显示的方式,缺省值为缺省值为1即:即:SW_SHOWNORMALhW

52、nd是前面创建的窗口的句柄,该是前面创建的窗口的句柄,该函数产生函数产生WM_PAINT消息,导致窗口消息,导致窗口被重绘被重绘5、消息循环、消息循环调用UpdateWindow(hWnd);函数之后,窗口就显示在显示屏幕上,这时程序就进入了消息循环,等待用户用键盘或鼠标操作窗口,产生消息。产生的消息将被放入消息队列:5、Windwos消息循环消息循环系统消息队列系统消息队列应用程序队列应用程序队列 1应用程序队列应用程序队列 2应用程序队列应用程序队列 3应用程序队列应用程序队列 n应用程序应用程序1WinMain()函数函数消息循环消息循环窗口窗口函数函数1窗口窗口函数函数m应用程序应用程

53、序1WinMain()函数函数消息循环消息循环窗口窗口函数函数1窗口窗口函数函数m硬件硬件输入输入MSG本队列本队列由由Windows系统系统建立和建立和维护维护MSGMSGMSGMSGMSGMSGMSGMSGwhile (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg); 消息循环从此开消息循环从此开始,它从消息队始,它从消息队列中取出一条消列中取出一条消息,息,WM_QUIT则退出则退出将将MSG消息进行传给消息进行传给WINDOWS系统,并进系统,并进行一些键盘转换行一些键盘转换再将再将MSG

54、消息传给消息传给WINDOWS系统,然后系统,然后WINDOWS系系统将该消息传给正确的窗口过程,让它进行处理。本程序统将该消息传给正确的窗口过程,让它进行处理。本程序是由是由WndProc函数处理,处理完毕后,函数处理,处理完毕后,WndProc返返windows,因为此时因为此时Windows调用还处于调用还处于DispatchMessage函数,在该函数执行后,再次返回到函数,在该函数执行后,再次返回到 下一个下一个GetMessage函数函数Windows应用程序的消息处理流程WM_KEYDOWNWM_KEYUPWM_MOUSEMOVEWM_LBUTTONUPWM_QUIT应用程序应用

55、程序消息队列消息队列WinMain()消息消息循环循环WndProc()case WM_KEYDOWNcase WM_KEYUPcase WM_LBUTTUPdefaultWM_CREATEWM_DESTROYWM_SIZEWM_PAINTGetMessage()检索到的消息检索到的消息DispatchMessage()DefWindowProcWindows系统应用程序应用程序回调回调6、窗口、窗口函数函数实际的动作发生在窗口函数中,窗口函数确定实际的动作发生在窗口函数中,窗口函数确定了在窗口的客户区域中显示些什么以及窗口函数怎样了在窗口的客户区域中显示些什么以及窗口函数怎样响应用户的输入。

56、响应用户的输入。LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)说明:说明:1、WndProc是一个回调函数CALLBACK指定窗口函数是一个回调函数。回调就是由Windows系统调用的意思,即窗口函数是由Windows系统调用的,应用程序不必调用它。2、窗口函数的参数每个Windows应用程序的窗口函数都有着相同的参数表:第1个参数hWnd用于标识接收消息的窗口句柄;第2个参数message用于标识消息,该消息将被用于处理消息的switch结构中;第3、4个参数wParam和lParam是messag

57、e的附加信息,它们的内容随message消息而异,如鼠标消息与键盘消息的wParam和lParam参数就不一样。窗口函数主要利用这些参数响应窗口事件,实现程序功能。6、窗口、窗口函数函数7、消息、消息处理处理窗口函数窗口函数所接收的消息都是用一个数值来标识的,它就是传递给窗口过程的message参数,消息在WINDOWS.H头文件中定义,它们是以“WM_”的标识符。一般地,在WINDOWS程序中使用switch和case结构来确定窗口函数窗口函数接收的是什么消息以及如何处理它。窗口窗口函数窗口函数不处理的消息被传给:DefWindowProc函数进行缺省处理。switch (message)

58、case WM_CREATE: break;case WM_PAINT: break;case WM_DESTROY: default: return DefWindowProc(); 消息处理过消息处理过程程8、数据输出、数据输出与与WM_PAINT消息消息WM_PAINT消息对于windows程序设计是极其重要的,当窗口客户区的一部分或全部变为“无效”时,将产生该消息,它导致窗口重绘。Hellowwindow中窗口的类型为:CS_HREDRAW|CS_VREDRAW;该类型指示当窗口水平或垂直方向发生变化时,窗口将产生WM_PAINT消息致使窗口重绘。WM_PAINT消息的处理模式:hdc

59、=BeginPaint(hwnd,&ps)进行窗口绘制的程序代码EndPaint(hwnd,&ps);8、数据输出与、数据输出与WM_PAINT消息消息9、WM_DESTROY消息与程序结束消息与程序结束这是一条重要的消息,它指示windows系统关闭该应用程序。系统菜单上的close或ALT+F4都会产生该消息。Hellowwindow程序通过PostQuitMessage(0);函数产生该消息。导致应用程序的关闭。WM_DESTROY与与WinMain结束结束应用程序应用程序消息队列消息队列WinMain()消息消息循环循环WndProc()case WM_KEYDOWNcase WM_K

60、EYUPcase WM_DESTROYdefaultWM_DESTROY消息消息GetMessage()WM_QUIT退出消息循环退出消息循环结束应用程序结束应用程序PostQuitMessage(0)Windows系统系统应用程应用程序序10.4 Windows API程序设计的方法程序设计的方法Windows程序由主函数WinMain和窗口处理函数构成。WinMain是程序执行的入口点,每个WinMain的主要功能是创建程序窗口、建立消息循环,其程序结构和代码几乎完全相同。窗口函数主要处理发生在程序窗口中的各种用户事件(如选择菜单、单击鼠标等),是Windows程序设计的主体和重点,程序的

61、不同功能都是在窗口函数的消息处理中实现的。因此编程工作主要在窗口函数编程工作主要在窗口函数中。在VC+环境中设计API程序时,可以先利用VC+向导生成一个简单的应用程序框架,然后对框架程序中的窗口函数进行修改,添加响应窗口事件的消息处理代码段,增加程序的数据输出和消息处理功能增加程序的数据输出和消息处理功能,就能够实现需要的程序功能。10.4.1 Windows程序的数据输出程序的数据输出1、GDI(GraphicsDeviceInterface)GDI是Windows为应用程序提供的图形设备接口,其中提供了丰富的图形API函数。GDIAPI函数大致可以分为3种类型字符输出类函数,以图形方式输

62、出字符、文本;矢量图形函数,用于绘制点、线、椭圆、三角形等几何图形;光栅图形函数,用于绘制位图。10.4.1 Windows程序的数据输出程序的数据输出2、设备无关性、设备无关性是指在用GDI函数设计针对不同硬件设备的输出程序时,不必考虑具体的硬件特性,只需用统一的方式编写程序,Windows系统会自动调用具体设备的硬件驱动程序将GDI图形输出程序转换成特定硬件设备的输出程序。10.4.1 Windows程序的数据输出程序的数据输出3、设备环境(、设备环境(Device Context,DC)也称为设备描述表或设备上下文。是Windows为了实现设备无关性而向应用程序提供了一个虚拟逻辑设备,它

63、其实是一种数据结构,其中存了绘图操作需要的所有信息,如绘画笔、字体、图画颜色、绘制的图形背景及绘图的模式。设备环境由Windows系统统一管理,当应用程序需要输出图形(包括字符)时,必须向Windows系统提出申请,用完后必须释放,以便其他程序申请使用。DC相当画家手中的绘图工具,包括画纸、画笔、颜料。程序只需要用DC中的画笔在DC中作画,Windows就会直接将之转换输出到显示器、打印机之类的输出设备上。10.4.1 Windows程序的数据输出程序的数据输出4、Windows程序的输出过程程序的输出过程(1)程序首先获取设备环境句柄(2)通过该句柄调用图形设备接口的绘图函数绘图。(3)绘图

64、函数所绘制的图形被Windows系统提供的设备驱动程序转换成具体物理设备的绘图函数,从而在具体硬件设备上绘制出图形。5获取设备环境获取设备环境(1)用API函数BeginPaint获取设备环境句柄如果在WM_PAINT消息处理中输出图形消息处理中输出图形,就应该使用函数BeginPaint获取设备环境句柄,用法如下:PAINTSTRUCTps;/此数据结构的说明见下页caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);/获取设备环境句柄/绘制图形或输出文本的程序代码EndPaint(hwnd,&ps);5获取获取设备环境设备环境说明:(说明:(1)PAINTSTRUCT

65、结构的定义如下:结构的定义如下:typedefstructtagPAINTSTRUCTHDChdc;/设备环境句柄BOOLfErase;/指示是否擦除无效区域背景RECTrcPaint;/用于标识无效的矩形区域BOOLfRestore;/系统保留BOOLfIncUpdate;/系统保留BYTErgbReserved16;/系统保留PAINTSTRUCT;(2)BeginPaint用于获取设置环境句柄,EndPaint用于释放设备环境句柄。BeginPaint和EndPaint必须配对使用。5获取设备环境获取设备环境(2)用)用GetDC获取设备环境句柄获取设备环境句柄如果在是在除除WM_PAI

66、NT之外之外的其他消息处理中输出图形,就应该用GetDC获取设备环境句柄,用完后必须使用ReleaseDC将其释放。其形式如下:caseWM_XX:/WM_XX非WM_PAINThdc=GetDC(hWnd);/hWnd是窗口句柄/绘制图形或输出文本的程序代码ReleaseDC(hWnd,hdc);/释放设备环境句柄break;其中:其中:GetDC和和ReleaseDC须配对使用须配对使用6输出图形输出图形设备环境(即设备描述表)定义了绘图的图形对象和图形模式,应用程序获取到了设备环境后,就能够通过设备环境句柄使用GDIAPI函数来绘制图形。在用设备环境输出图形之前,应用程序可以事先把一些绘

67、图对象选入设备环境中,然后就可以用这些对象来绘制图形。表5-1是常用的绘图对象对对 象象定义对象句柄的定义对象句柄的结构结构Windows定义定义的备用对象的备用对象说说 明明BitmapHBITMAP用于处理位图用于处理位图BrushHBRUSHXX_BRUSH用于填充图形的内部用于填充图形的内部PaletteHPALETTE用于管理颜色用于管理颜色FontHFONTXX_FONT用于设置文本的字体用于设置文本的字体PenHPENXX_PEN用于绘制图形用于绘制图形6输出图形输出图形GDI中常用的函数中常用的函数MoveTo(hDC,x,y);/将画笔从当前位置移到(x,y)坐标BOOLLi

68、neToEx(HDChdc,intx,inty);/从当前点画直线到(x,y)坐标处BOOLRectangle(HDChdc,intx1,inty1,intx2,inty2);/以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画矩形BOOLRoundRect(HDChdc,intx1,inty1,intx2,inty2,inth,intw);/以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画圆角矩形BOOLEllipse(HDChdc,intx1,inty1,intx2,inty2);/以(x1,y1)为左上角坐标,(x2,y2)为右下角坐标画椭圆7输出输出文本文本Windo

69、ws程序的文本按图形方式输出。输出文本时必须以像素为单位精确定位每一行的输出位置。常用文本输出函数有TextOut和DrawTexBOOL TextOut(HDC hdc,int x,int y,LPCTSTR lpString,int n);int DrawText(HDC hdc,LPCTSTR lpString,int n,LPRECT lpRect,UINT uFormat);7输出输出文本文本输出文本的字体设置问题Windows提供了丰富的字体,不同字体的高度和宽度也不尽相同,函数GetTextMetrics能够获取当前字体的详细信息,如字符的完度、高度、字间距、行间距等信息。其原型

70、如下:BOOLGetTextMetrics(HDChdc,TEXTMETRICS&tm);TEXTMETRICS是保存字体信息的数据结构,主要域如下是保存字体信息的数据结构,主要域如下:typedefstructtagTEXTMETRICLONGtmHeight;/字符高度LONGtmExternalLeading; /行间距LONGtmAveCharWidth;/字符的平均宽度LONGtmMaxCharWidth;/最大字符宽度LONGtmWeight;/字符的粗细度BYTEtmCharSet;/字符集TEXTMETRIC;10.4.1 Windows程序的数据输出程序的数据输出【例10-2

71、】在例10-1的基础上,修改窗口函数中的WM_PAINT消息,让程序用默认画笔和画刷绘制一个矩形,然后创建蓝色画笔和红色网格画刷编绘制一个矩形和椭圆。并通过函数TextOut分别用系统默认色彩和红色输出两行文本。修改后的窗口函数WndProc如下:WndProc函数的程序代码LRESULTCALLBACKWndProc()/同例同例10-1HPENhPen,hPenOld;/定义画笔HBRUSHhBrush,HbruOld; /定义画刷TEXTMETRICtm;/定义tm用于获取字体信息intx=10,y=150;switch(message)/消息处理caseWM_CREATE:return

72、0;caseWM_PAINT:hPen=(HPEN)CreatePen(PS_SOLID,3,RGB(0,0,255);/创建蓝色实线画笔,宽3像素点hBrush=(HBRUSH)CreateHatchBrush(HS_CROSS,RGB(255,0,0);/创建红色网格线的画刷hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT(Hello,APIProgramming!),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);Rectangle(hdc,10,10,80,

73、80);/用默认画笔和画刷绘制椭圆/下面用SelectObject函数将创建的画笔和画刷选入Windows系统,选入之后/所有的图形函数都会用新建的蓝色画笔画图,用红色的网格画刷填充图形hPenOld=(HPEN)SelectObject(hdc,hPen);/选入新画笔,返回旧画笔句柄选入新画笔,返回旧画笔句柄HbruOld=(HBRUSH)SelectObject(hdc,hBrush); /选入新画刷,返回旧画刷句柄选入新画刷,返回旧画刷句柄Rectangle(hdc,100,10,180,80);/画矩形Ellipse(hdc,250,10,350,80); /画椭圆画椭圆Select

74、Object(hdc,hBrush);/恢复系统默认画刷SelectObject(hdc,hPenOld);/恢复系统默认画笔GetTextMetrics(hdc,&tm);/将当前字体信息存入tmTextOut(hdc,x,y,默认系统的字体色彩!,20);SetTextColor(hdc,RGB(255,0,0);/设置字体为红色y=y+tm.tmHeight+tm.tmExternalLeading;/计算下一行字体输出的纵坐标TextOut(hdc,x,y,红色的字体色彩!,16); /用设置的颜色输出文本EndPaint(hwnd,&ps);return0;10.4.2消息处理消息处

75、理消息处理是Windows程序设计的中心,是对发生在程序窗口中的事件的响应,程序要实现什么功能,要处理什么事件,只需要在窗口函数的switch结构中增加相应事件的消息处理代码即可。【例10-3】对例10-1的窗口函数进行修改,增加鼠标消息处理功能,左键单击该位置产生一个矩形,在右键单击该位置产生一个圆。设计思想:设置两个数组分别保存鼠标左键和右键的点击位置,在每次产生WM_LBUTTONDOWN和WM_RBUTTONDOWN消息时就将鼠标位置放入数组中,同时产生一条WM_PAINT消息,导致WM_PAINT消息处理中的代码被执行。在WM_PAINT消息中从两个数组内依次取出保存的鼠标点,并以此

76、点为中心绘制矩形和圆。修改例10-1的WinProc程序后的代码如下LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)HDChdc;PAINTSTRUCTps;staticPOINTRect20,Elli20;/Rect保存矩形的鼠标点,Elli保存椭圆的鼠标点staticintn=0,m=0;/n、m分别用于记录Rect、Elli中点的个数inti,j;switch(message)/消息处理case WM_CREATE:return0;case WM_LBUTTONDOWN:Rectn.x=LOWOR

77、D(lParam);/计算鼠标的x坐标Rectn.y=HIWORD(lParam);/计算鼠标的y坐标InvalidateRect(hwnd,NULL,FALSE);/产生WM_PAINT消息n+;return0;case WM_RBUTTONDOWN:Ellin.x=LOWORD(lParam);Ellin.y=HIWORD(lParam);InvalidateRect(hwnd,NULL,FALSE);m+;return0;caseWM_PAINT:hdc=BeginPaint(hwnd,&ps); for(i=0;in;i+)/绘制矩形Rectangle(hdc,Recti.x,Recti.y,Recti.x+60,Recti.y+60); for(j=0;jm;j+)/绘制椭圆Ellipse(hdc,Ellij.x,Ellij.y,Ellij.x+60,Ellij.y+60); EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(0);return0;returnDefWindowProc(hwnd,message,wParam,lParam);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号