c+Windows应用程序.ppt
第3讲 Windows应用程序 GUI程序Visual C+Visual C+程序设计程序设计程序设计程序设计主讲:李贵荣主讲:李贵荣主讲:李贵荣主讲:李贵荣湖北汽车工业学院湖北汽车工业学院湖北汽车工业学院湖北汽车工业学院1本讲内容p1 1 WindowsWindows操作系统简介操作系统简介p2 Windows2 Windows编程基础知识编程基础知识p3 3 WindowsWindows消息消息p4 4 WindowsWindows中的消息处理机制(事件驱动)中的消息处理机制(事件驱动)p5 5 WindowsWindows程序的基本结构程序的基本结构p6 6 应用举例应用举例 2Windows操作系统简介pWindows操作系统的发展u1983年12月首次推出Windows系统的第一个版本的,命名为Windows v1.0 u1985年推出了Windows v1.1版本u1987年10月,Microsoft发行了Windows系统的另一个重要版本Windows v2.0u1990年5月,Microsoft公司发行了一个划时代的版本Windows v3.0u1992年4月,Microsoft公司又推出了支持象动态数据交换、对象连接和嵌入、多媒体等功能的Windows v3.1版本3Windows操作系统简介pWindows操作系统的发展u1995年,Microsoft公司隆重推出了Windows 95u1998年,Microsoft公司推出了Windows 98版本u1999年12月,微软公司发行32位图形商业性质的Windows 2000操作系统,基于NT技术,Windows NT系列是纯32位操作系统,使用先进的NT核心技术,非常稳定。u2000年9月,微软公司发行Windows ME是一个16位/32位混合的Windows系统。u2001年8月,Windows XP是基于Windows 2000代码的产品,同时拥有一个新的用户图形界面。4Windows操作系统的特点p图形化的用户界面Windows系统及Windows应用程序的用户可以得到一致的用户界面所带来的许多认识的方便。p多任务机制Windows向用户提供非常重要的多任务功能。p硬件即插即用功能Windows提供了各种设备驱动程序支持各种各样的外部设备。p与设备无关的图形图像机制5Windows编程基础pWindows界面 Win32操作系统为我们提供了一组预先构造好的界面元素或控件来建立GUI外观和作用相像的应用程序。这种方法使用户熟悉Windows 应用,并使用户能较容易地把操作技术的有关知识从熟悉的软件应用传递到新的不熟悉的软件应用中。我们通过编程还可以自定义控件及其式样,给界面设计人员提供创作空间。6Windows编程基础pWindows是一种基于图形界面的多任务操作系统。基于Windows的程序有着相同的外观和命令结构。对用户 来说,学习使用Windows应用程序变得容易了。pWindows运行应用程序以硬件无关的方式来处理视频显示、键盘、鼠标、打印机、串行口以及系统时钟。尤其是标准化的图形用户界面,统一的界面使用图片或图标来代表磁盘驱动器、文件、子目 录以及其它操作系统的命令和动作。统一的用户界面也为程序员带来了好处。pWindows的多任务环境允许用户在同一时刻运行多个应用程序或同一个应用程序的多个实例。一个应用程序可能处于激活状态。激活的应用程序是指它正接收用户的输入。同一时间有也只能有一个应用程序处于激活状态,但可以有任意个数的并行运行的任务。Windows提供了大量的内建 函数以方便地使用弹出菜单、滚动条、对话框、图标和其他一些友好的用户界面应该具有的特性。可以很方便地使用常见菜单和对话框的内建函数。所有的菜单都具有相同风格的键盘和鼠标接口,因为是Windows而不是程序员在实现它。7Windows编程基础开发环境程序调试工具程序调试工具包括源程序语包括源程序语法检查、可执法检查、可执行程序修改和行程序修改和运行监视等运行监视等应用程序应用程序HelpHelp和和SetupSetup开发开发工具包工具包系统函数库和系统函数库和系统函数开发系统函数开发工具工具资源管理器资源管理器包括图形化窗包括图形化窗口及组成元素口及组成元素的多种对象的的多种对象的编辑器编辑器可选择并构成具体可选择并构成具体语句或源程序结构语句或源程序结构的例程库及的例程库及Help源程序编辑源程序编辑器和编译器器和编译器可视化开发可视化开发系统集成了一系系统集成了一系列系统可用资源列系统可用资源和开发工具和开发工具8Windows编程基础开发工具p面向对象编程语言uC+、Java、Delphi、VB.p编程对象组件(对象)u窗口u对话框、按钮、资源(位图、图标、字符串)u开发Windows相当大的程度上在创建对象、修改组件对象的属性p对象的特征u静态属性+动态行为p编程方法传统编写法:API交互式方法:MFC9Windows编程基础API图形设备图形设备(GDI)函函数数:实现与设备:实现与设备无关的图形操作无关的图形操作功能功能APIAPI函数函数的功能的功能为应用程序为应用程序提提供供Windows系统系统特殊函数特殊函数及及数据结构数据结构Win应用程序应用程序可以利用标准可以利用标准大量大量API函数函数调用系统功能调用系统功能是是Win系统系统与与Win应用程序应用程序间的间的标准程序标准程序接口接口窗口管理函数窗口管理函数实现窗口的创实现窗口的创建、移动和修建、移动和修改功能改功能系统服务函数系统服务函数:实现与操作系统实现与操作系统有关的多种功能有关的多种功能10Windows编程基本概念窗口p窗口窗口边界窗口边界工作区工作区控制菜单框控制菜单框下拉菜单下拉菜单水平滚动条水平滚动条垂直滚动条垂直滚动条最大化按钮最大化按钮最小化按钮最小化按钮标题栏标题栏11Windows编程基本概念界面组件p用户界面(窗口)的组成u窗口主边框和窗口子边框窗口主边框和窗口子边框u用户区用户区u控制菜单框控制菜单框u标题条标题条u菜单条菜单条u工具条工具条u水平滚动条和垂直滚动条水平滚动条和垂直滚动条u最大化最大化/还原窗口按钮还原窗口按钮u最小化按钮最小化按钮u关闭按钮关闭按钮u状态条状态条.12Windows编程基本概念界面组件p用户界面组件皆为对象p将世界看成是一组彼此相关并相互通信的实体即对象组成,每个对象有一个名字来标识。例如,当看见一辆汽车时,所见到的是一辆汽车,而不是一大堆原子。可以将汽车分解为车轮、发动机、车门、油箱等,它们都是具体的实体即对象。p窗口本身及其成组成部分均可以看成对象。窗口的显示样式(效果)均可以改变或设置相应组件的属性来实现;窗口的动作也由组件之间发送消息来实现。13Windows编程基本概念界面组件p对象之间的通信被称为发送消息。p即一个对象请求另一个对象执行某种方式的操作。例如,交叉路口的红灯“请求”驾驶员停车,驾驶员在接受到消息之后,他所执行的动作是踏下制动踏板,这有向汽车发送了一条消息,汽车在接受到此消息之后,又将该消息分解之后发送到相关的对象上:制动器作用于车轮上,将动能转变成为势能,使车速降下来;尾灯又向它后面的其它车辆的驾驶员发送消息;各种仪表盘向驾驶员反馈出所发送的消息的动作结果。14Windows编程基本概念界面组件p从编程角度看,对象是内存中一块有名的存储单元。p所谓变量就是一种数据对象,但对象的概念比变量的含义更广义,通常将对象定义成为包含有数据和代码的内存区域,数据表征对象的特征(属性),而代码用于响应消息,使对象进行某些动作(行为)。从屏幕上显示的一个可视的窗口对象为例,我们可以对比分析一下用户心目中的对象和程序员心目中的对象的关系。窗口对象的特征,例如颜色、长度、显示的内容等,在程序中对应为数据,用户对窗口对所做的操作,例如移动窗口、改变窗口的大小等,使得用户向窗口发送了消息,这些消息引起了计算机(内存中的)对象执行相应的代码,代码执行的结果改变了对象中的数据,使对应的可视对象的位置和大小发生了变化。15Windows编程基本概念界面组件p发送消息类似于标准的函数调用,但消息也有函数调用中没有的特性。例如,消息始终在执行一选择机制,其参数与其它消息区别开来,从而告诉该对象完成什么样的操作。一个函数名始终指向内存中该函数的代码所位于的确定地址,消息并不指向内存中的某地址,但却告诉接受消息的对象要引用的内存地址是什么。p函数不仅说明操作,而且还要执行如何完成该操作的方法。消息只说明该操作,在对象中定义的方法说明如何完成该操作。当向不同的对象发送相同的消息时,所执行的方法是不同的。16Windows编程基本概念句柄p句柄是Windows编程的基础。pWindows应用程序中存在许多对象,例如选单、窗口、图标、内存对象、位图、刷子、设备对象和程序实例等,在Windows中,对象使用句柄进行标识,通过使用一个句柄,应用程序可以访问一个对象。u所谓句柄是Windows使用的一种无重复整数。u句柄主要用来标识应用程序中的一个对象。u句柄只能进行赋值、与另句柄比较及是否NULL操作。常用句柄类型及其说明常用句柄类型及其说明HWNDHWND窗口句柄窗口句柄HDCHDC设备环境句柄设备环境句柄HBITMAPHBITMAP位图句柄位图句柄HCURSORHCURSOR光标句柄光标句柄HICONHICON图标句柄图标句柄HFONTHFONT字体句柄字体句柄HMENUHMENU菜单句柄菜单句柄HPENHPEN画笔句柄画笔句柄HFILEHFILE文件句柄文件句柄HBRUSHHBRUSH画刷句柄画刷句柄HINSTANCEHINSTANCE 当前实例句柄当前实例句柄17句柄句柄是一个句柄是一个4字节长的数值,用于标识字节长的数值,用于标识应用程序中不同的应用程序中不同的对象对象和和同类对象中不同类对象中不同的实例同的实例窗口窗口按钮按钮图标图标滚动条滚动条输出设备输出设备控制控制文件文件应用程序通过应用程序通过句柄访问相应句柄访问相应的对象信息的对象信息18Windows编程基本概念消息p Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。p消息内容用一个结构体MSG来描述:typedef struct tagMSG HWND hwnd;/窗口句柄,为null,则可检索所有驻留在消息队列中的消息 UINT message;/消息值,由Windows.h头文件中的宏定义来标识 WPARAM wParam;/字参数,有关消息的附加信息,不同消息其值有所不同 LPARAM lParam;/长字参数 DWORD time;指定消息送至队列的时间 POINT pt;/指定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体MSG;typedeftypedef structstruct tagPOINTtagPOINT LONG x LONG x;LONG y;LONG y;POINT;POINT;19消息号:由事先定义好的消息名标识消息号:由事先定义好的消息名标识字参数字参数(wParam):用于提供消息的用于提供消息的附附加信息加信息长字参数长字参数(lParam):用于提供消息的用于提供消息的附加信息附加信息消消息息附加信息附加信息与具体与具体消息号的值有关,消息号的值有关,在在Win中消息用中消息用结构体结构体MSG表示表示20 VC中存在几种系统定义的消息分类,不同的前缀符号经常用中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:BM表示按钮控制消息表示按钮控制消息CB表示组合框控制消息表示组合框控制消息DM表示默认下压式按钮控制表示默认下压式按钮控制消息消息EM表示编辑控制消息表示编辑控制消息LB表示列表框控制消息表示列表框控制消息SBM表示滚动条控制消息表示滚动条控制消息WM表示窗口消息表示窗口消息窗口管理消息窗口管理消息初始化消息初始化消息输入消息输入消息系统消息系统消息剪贴板消息剪贴板消息控制处理消息控制处理消息控制通知消息控制通知消息滚动条通知消息滚动条通知消息非用户区消息非用户区消息MDI消息消息DDE消息消息应用程序自定义的消应用程序自定义的消息息Windows编编程常用消息程常用消息21此外,相似的消息还有:此外,相似的消息还有:lWM_LBUTTONUP:放开鼠标左键时产生;放开鼠标左键时产生;lWM_RBUTTONDOWN:单击鼠标右键时产生;单击鼠标右键时产生;lWM_RBUTTONUP:放开鼠标右键时产生;放开鼠标右键时产生;lWM_LBUTTONDBLCLK:双击鼠标左键时产生;双击鼠标左键时产生;lWM_RBUTTONDBLCLK:双击鼠标右键时产生。双击鼠标右键时产生。lParam高字节包含当前光标的高字节包含当前光标的Y坐标值坐标值低字节包含当前光标的低字节包含当前光标的X坐标值坐标值wParam包含一整包含一整数值以标识鼠标数值以标识鼠标键的键的按下状态按下状态MK_LBUTTON按下鼠标左键按下鼠标左键MK_MBUTTON按下鼠标中键按下鼠标中键MK_RBUTTON按下鼠标右键按下鼠标右键1.WM_LBUTTONDOWN1.WM_LBUTTONDOWN:产生单击鼠标左键的消息产生单击鼠标左键的消息产生单击鼠标左键的消息产生单击鼠标左键的消息Windows应用系统常用消息22 系统键是指实现系统操作的组合键,例如系统键是指实现系统操作的组合键,例如Alt与某与某个功能键的组合以实现系统菜单操作等。个功能键的组合以实现系统菜单操作等。3.WM_ CHAR3.WM_ CHAR:按下一个非系统键时产生的消息按下一个非系统键时产生的消息按下一个非系统键时产生的消息按下一个非系统键时产生的消息wParam 为为按键的按键的ASCII码码1Param 与与WM_KEYDOWN的相同的相同相似的消息还有相似的消息还有WM_KEYUP,在放开非系统键时产生在放开非系统键时产生2.WM_KEYDOWN2.WM_KEYDOWN:按下一个非系统键时产生的消息按下一个非系统键时产生的消息按下一个非系统键时产生的消息按下一个非系统键时产生的消息wParam:按下键的:按下键的虚拟键码虚拟键码,用以标识按下或释放的键,用以标识按下或释放的键1Param:记录了按键的重复次数、扫描码、转移代码、先前键的状:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。态等信息。23wParam:未用未用1Param:包含一个指向包含一个指向CREATESTRUCT数据结构的指针数据结构的指针wParam和和1Param均未用。均未用。wParam和和1Param均未用。均未用。4.WM_CREATE4.WM_CREATE:由由由由CreateWindowCreateWindow函数发出的消息函数发出的消息函数发出的消息函数发出的消息5.WM_CLOSE5.WM_CLOSE:关闭窗口时产生的消息关闭窗口时产生的消息关闭窗口时产生的消息关闭窗口时产生的消息6.WM_DESTROY6.WM_DESTROY:由由由由DestroyWiodowDestroyWiodow函数发出的消息函数发出的消息函数发出的消息函数发出的消息24用户区移动或显示用户区移动或显示用户窗口改变大小用户窗口改变大小程序通过滚动条滚动窗口程序通过滚动条滚动窗口下拉式菜单关闭并需要恢复被覆盖的部分下拉式菜单关闭并需要恢复被覆盖的部分Windows清除对话框等对象,并需要恢复被覆盖的部分清除对话框等对象,并需要恢复被覆盖的部分均产生均产生WM_PAINTWM_PAINT消息消息7.WM_QUIT7.WM_QUIT:由:由:由:由PostQuitMessagePostQuitMessage函数发出的消息函数发出的消息函数发出的消息函数发出的消息退出应用程序时发出的消息退出应用程序时发出的消息退出应用程序时发出的消息退出应用程序时发出的消息wParamwParam:含退出代码含退出代码含退出代码含退出代码,标识程序退出运行时的有关信息标识程序退出运行时的有关信息标识程序退出运行时的有关信息标识程序退出运行时的有关信息1Param1Param:未用未用未用未用8.WM_PAINT8.WM_PAINT25启动启动输入姓名输入姓名输入第一次测试成绩输入第一次测试成绩输入第二次测试成绩输入第二次测试成绩输入第三次测试成绩输入第三次测试成绩计算平均成绩计算平均成绩结束结束过程驱动方法计算平均成绩过程驱动方法计算平均成绩启动启动消息处理消息处理结束结束输入姓名输入姓名输入第一次成绩输入第一次成绩输入第二次成绩输入第二次成绩输入第三次成绩输入第三次成绩计算平均成绩计算平均成绩事件驱动方法计算平均成绩事件驱动方法计算平均成绩三、三、三、三、WindowsWindows中的事件驱动程序设计中的事件驱动程序设计中的事件驱动程序设计中的事件驱动程序设计26一个完整的一个完整的Windows应用程序应用程序通常由通常由五种类型五种类型的的文件组成。文件组成。1.C1.C语言源程序文件语言源程序文件2.2.头文件头文件3.3.模块定义文件模块定义文件4.4.资源描述文件资源描述文件5.5.项目文件项目文件四、四、Windows应用程序组成及编程步骤应用程序组成及编程步骤 1.应用程序的组成应用程序的组成27入口函数入口函数WinMain窗口函数窗口函数WndProcWndProcWindows应用程序应用程序构成基构成基本框架本框架包含各种包含各种数据类型、数据类型、数据结构数据结构与函数等与函数等WinMain和和WndProc是是Windows应用程序的主体应用程序的主体 2、源程序组成结构、源程序组成结构28(1)WinMain函数函数三个基本的组成部分:三个基本的组成部分:函数说明函数说明、初始化初始化和和消息循环消息循环功能功能注册窗口类,建立窗口及执行必要的初始化注册窗口类,建立窗口及执行必要的初始化进入消息循环,根据接受的消息调用相应的处理过程进入消息循环,根据接受的消息调用相应的处理过程当消息循环检索到当消息循环检索到WM_QUIT时终止程序运行时终止程序运行WinMain函数函数WinMain函数说明函数说明WinMain函数的说明如下:函数的说明如下:intint WINAPI WINAPI WinMainWinMain (HINSTANCE HINSTANCE hThisInsthThisInst,应用程序当前实例句柄应用程序当前实例句柄 HINSTANCeHINSTANCe hPrevInsthPrevInst,应用程序其他实例句柄应用程序其他实例句柄 LPSTR LPSTR lpszCmdLinelpszCmdLine,指向程序命令行参数的指针指向程序命令行参数的指针 IntInt nCmdShownCmdShow应用程序开始执行时窗口显示方式的整数值标识应用程序开始执行时窗口显示方式的整数值标识)注意!注意!Win是多任务管理的,同一应是多任务管理的,同一应用程序的多个窗口可能会同时存在用程序的多个窗口可能会同时存在,系统对每个窗口的执行称为一个实例系统对每个窗口的执行称为一个实例并用一个实例句柄来唯一标识并用一个实例句柄来唯一标识29(2)初始化初始化i.窗口类定义窗口类定义 通过给窗口类数据结构通过给窗口类数据结构WNDCLASS赋值完成赋值完成,该数据结该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数:构中包含窗口类的各种属性。窗口类定义常用以下函数:LoadIcon的作用是在应用程序中加载一个窗口图标。其原型为:的作用是在应用程序中加载一个窗口图标。其原型为:HICON HICON LoadIcon(HINSTANCELoadIcon(HINSTANCE hInstance,LPCTSTRhInstance,LPCTSTR lpIconNamelpIconName)图标资源名或系统预定义图标标识名图标资源名或系统预定义图标标识名图标资源所在的模块句柄,图标资源所在的模块句柄,NULLNULL则使用系统预定义图标则使用系统预定义图标初初始始化化显示窗口显示窗口创建窗口实例创建窗口实例窗口类的注册:窗口类必须先注册后使用窗口类的注册:窗口类必须先注册后使用窗口类的定义:定义窗口的形式与功能窗口类的定义:定义窗口的形式与功能LoadIconLoadIconLoadCursorLoadCursorGetStockObjectGetStockObjectRegisterClassRegisterClassCreateWindow ShowWindowShowWindow ,UpdateWindowUpdateWindow30LoadCursor的作用是在应用程序中加载一个窗口光标的作用是在应用程序中加载一个窗口光标HCURSOR HCURSOR LoadCursor(HINSTANCELoadCursor(HINSTANCE hInstancehInstance,LPCTSTR LPCTSTR lpCursorNamelpCursorName)光标资源所在的模光标资源所在的模块句柄,块句柄,NULLNULL则使则使用系统预定义光标用系统预定义光标光标资源名或系统光标资源名或系统预定义光标标识名预定义光标标识名应用程序调用函数应用程序调用函数GetStockObject获取系统提供的背景刷获取系统提供的背景刷HBRUSH HBRUSH GetStockObject(intGetStockObject(int nBrushnBrush););31ii.注册窗口类注册窗口类Win系统本身提供部分预定义的窗口类,程序员也可以系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注自定义窗口类,窗口类必须先注册后使用。窗口类的注册由函数册由函数RegisterClass()实现。实现。RegisterClass(&wndclassRegisterClass(&wndclass);/);/wndclasswndclass为窗口类结构为窗口类结构 RegisterClassRegisterClass函数的返回布尔值,注册成功则返回真函数的返回布尔值,注册成功则返回真32iii.创建窗口实例创建窗口实例创建一个窗口类的实例由函数创建一个窗口类的实例由函数CreateWindowCreateWindow()()实现实现函数原型如下:函数原型如下:HWND HWND CreateWindowCreateWindow (LPCTSTR (LPCTSTR lpszClassNamelpszClassName,窗口类名窗口类名 LPCTSTR LPCTSTR lpszTitlelpszTitle,窗口标题名窗口标题名 DWORD DWORD dwStyledwStyle,创建窗口的样式创建窗口的样式 intint x,y,x,y,窗口左上角坐标窗口左上角坐标 intint nWidth,nHeightnWidth,nHeight,窗口宽度和度高窗口宽度和度高 HWND HWND hwndParenthwndParent,该窗口的父窗口句柄该窗口的父窗口句柄 HWENU HWENU hMenuhMenu,窗口主菜单句柄窗口主菜单句柄 HINSTANCE HINSTANCE hInstancehInstance,创建窗口的应用程序当前句柄创建窗口的应用程序当前句柄 LPVOID LPVOID lpParamlpParam 指向一个传递给窗口的参数值的指针指向一个传递给窗口的参数值的指针 )3334iv显示窗口显示窗口窗口类的显示由窗口类的显示由ShowWindow和和UpdateWindow函数实现。应用程函数实现。应用程序调用序调用ShowWindow函数在屏幕上显示窗口函数在屏幕上显示窗口ShowWindow(hwnd,nCmdshowShowWindow(hwnd,nCmdshow);/nCmdshow为窗口显示形式标识为窗口显示形式标识显示窗口后,应用程序调用显示窗口后,应用程序调用UpdateWindow更新并绘制更新并绘制用户区,并发出用户区,并发出WM_PAINT消息。消息。UpdateWindow(hwndUpdateWindow(hwnd););35(3)消息循环消息循环消息循环的常见格式如下:消息循环的常见格式如下:MSG MSG MsgMsg;while(while(GetMessageGetMessage(&Msg,NULL,0,0)(&Msg,NULL,0,0)TranslateMessage(&MsgTranslateMessage(&Msg););DispatchMessage(&MsgDispatchMessage(&Msg););将消息的虚拟键将消息的虚拟键转换为字符信息转换为字符信息将消息传送到将消息传送到指定窗口函数指定窗口函数从消息队列中读取从消息队列中读取一条消息,并将消一条消息,并将消息放在息放在MSG结构中结构中 其中函数其中函数GetMessage形式为:形式为:GetMessageGetMessage(lpMSGlpMSG,/指向指向MSGMSG结构的指针结构的指针 hwndhwnd,nMsgFilteMinnMsgFilteMin,/,/用于消息过滤的最小消息号值用于消息过滤的最小消息号值 nMsgFilterMaxnMsgFilterMax/用于消息过滤的最大消息号值用于消息过滤的最大消息号值 )返回零值,即检索返回零值,即检索到到WM_QUITWM_QUIT消息,程消息,程序结束循环并退出序结束循环并退出将消息传递给将消息传递给窗口函数的相窗口函数的相应过程处理应过程处理消消息息队队列列Windows将将产生的消息产生的消息WinMain函数函数36 WndProc函数由一个或多个函数由一个或多个switch语句组成。每一条语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息语句对应一种消息,当应用程序接收到一个消息时,相应的时,相应的case语句被激活并执行相应的响应程序模语句被激活并执行相应的响应程序模块。块。WndProc包含了对各种可能接收到的消息的处理过程包含了对各种可能接收到的消息的处理过程定义定义了应用程序对接收到的不同消息的响应了应用程序对接收到的不同消息的响应3 3 窗口函数窗口函数窗口函数窗口函数WndProcWndProc37窗口函数的一般形式如下:窗口函数的一般形式如下:LRESULT CALLBACK LRESULT CALLBACK WndProcWndProc(HWND HWND hwndhwnd,UINT UINT messgaemessgae,WPARAM WPARAM wParam,LPARAMwParam,LPARAM lParamlParam)switch(message)switch(message)message message为标识的消息为标识的消息 case case break;break;case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);default:default:return return DefWindowProc(hwnd,message,wParam,lParamDefWindowProc(hwnd,message,wParam,lParam););return(0);return(0);在消息处理程序段中一般都有对在消息处理程序段中一般都有对WM_DESTROYWM_DESTROY的处理的处理,该消息是关闭窗口时发出该消息是关闭窗口时发出的。它向应用程序发出的。它向应用程序发出WM_QUITWM_QUIT消息,请求退消息,请求退出处理函数:出处理函数:void void PostQuitMessage(intPostQuitMessage(int nExitCodenExitCode)/nExitCodenExitCode为应用程序的退出为应用程序的退出代码代码为未定义处理过程的消息提供默认的处理为未定义处理过程的消息提供默认的处理38 在在Windows.hWindows.h中中定义了定义了WindowsWindows 应用程序中包含种应用程序中包含种类繁多的数据类型类繁多的数据类型4 4数据类型数据类型数据类型数据类型39MSG:包含一个消息的全部信息,是消息发送的格包含一个消息的全部信息,是消息发送的格式式WNDCLASS:包含一个窗口类的全部信息及属性包含一个窗口类的全部信息及属性POINT:定义了屏幕上或窗口中的一个点的定义了屏幕上或窗口中的一个点的X和和 Y坐标坐标RECT:定义了一个矩形区域及其左上角和右下角的定义了一个矩形区域及其左上角和右下角的坐标坐标几几种种重重要要的的结结构构5.5.一些重要的数据结构一些重要的数据结构一些重要的数据结构一些重要的数据结构40【例例3-1】创建应用程序框架。本例的目的创建应用程序框架。本例的目的在于说明创建在于说明创建Windows应用程序的方法及过应用程序的方法及过程程#include#include/包含应用程序中所需的数据类型和数包含应用程序中所需的数据类型和数据结构的定义据结构的定义LRESULT CALLBACK LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAMWndProc(HWND,UINT,WPARAM,LPARAM);/);/窗口窗口函数说明函数说明/-/-以下初始化窗口类以下初始化窗口类 -intint WINAPI WINAPI WinMain(HINSTANCEWinMain(HINSTANCE hInstancehInstance,HINSTANCE HINSTANCE hPrevInst,LPSTRhPrevInst,LPSTR lpszCmdLine,intlpszCmdLine,int nCmdShownCmdShow)HWND HWND hwndhwnd;MSG MSG MsgMsg;WNDCLASS WNDCLASS wndclasswndclass;char char lpszClassNamelpszClassName=窗口窗口;/窗口类名窗口类名 char char lpszTitlelpszTitle=My_Windows;=My_Windows;/窗口标题名窗口标题名五、应用程序举例五、应用程序举例五、应用程序举例五、应用程序举例41/窗口类的定义窗口类的定义wndclass.stylewndclass.style=0;=0;/窗口类型为默认类型窗口类型为默认类型wndclass.lpfnWndProcwndclass.lpfnWndProc=WndProcWndProc;/定义窗口处理函数定义窗口处理函数wndclass.cbClsExtrawndclass.cbClsExtra=0;=0;/窗口类无扩展窗口类无扩展wndclass.cbWndExtrawndclass.cbWndExtra=0;=0;/窗口实例无扩展窗口实例无扩展wndclass.hInstancewndclass.hInstance=hInstancehInstance;/当前实例句柄当前实例句柄wndclass.hIconwndclass.hIcon=LoadIcon(NULL,IDI_APPLICATIONLoadIcon(NULL,IDI_APPLICATION););/窗口的最小化图标为默认图标窗口的最小化图标为默认图标wndclass.hCursorwndclass.hCursor=LoadCursor(NULL,IDC_ARROWLoadCursor(NULL,IDC_ARROW););/窗口采用箭头光标窗口采用箭头光标wndclass.hbrBackgroundwndclass.hbrBackground=GetStockObject(WHITE_BRUSHGetStockObject(WHITE_BRUSH););/窗口背景为白色窗口背景为白色wndclass.lpszMenuNamewndclass.lpszMenuName=NULL;=NULL;/窗口中无菜单窗口中无菜单wndclass.lpszClassNamewndclass.lpszClassName=lpszClassNamelpszClassName;/窗口类名为窗口类名为 窗口窗口 42/-/-以下进行窗口类的注册以下进行窗口类的注册 if(!RegisterClassif(!RegisterClass(&(&wndclasswndclass)/)/如果注册失败则发出警告如果注册失败则发出警告 MessageBeep(0);MessageBeep(0);return FALSE;return FALSE;/-/-创建窗口创建窗口 -hwndhwnd=CreateWindowCreateWindow(lpszClassNamelpszClassName,/窗口类名窗口类名lpszTitlelpszTitle,/窗口实例的标题名窗口实例的标题名WS_OVERLAPPEDWINDOW,WS_OVERLAPPEDWINDOW,/窗口的风格窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,/窗口左上角坐标为默认值窗口左上角坐标为默认值CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,/窗口的高和宽为默认值窗口的高和宽为默认值NULL,NULL,/此窗口无父窗口此窗口无父窗口NULL,NULL,/此窗口无主菜单此窗口无主菜单hInstancehInstance,/创建此窗口的应用程序的当前句柄创建此窗口的应用程序的当前句柄NULL NULL/不使用该值不使用该值););43/-/-显示窗口显示窗口 -ShowWindowShowWindow(hwndhwnd,nCmdShownCmdShow););/-/-绘制用户区绘制用户区 -UpdateWindow(hwndUpdateWindow(hwnd););/-/-消消 息息 循循 环环 -while(while(GetMessage(&MsgGetMessage(&Msg,NULL,0,0),NULL,0,0)TranslateMessageTranslateMessage(&(&MsgMsg););DispatchMessageDispatchMessage(&(&MsgMsg););return return Msg.wParamMsg.wParam;/消息循环结束即程序终止时将信息返消息循环结束即程序终止时将信息返回系统回系统 44/窗口函数窗口函数LRESULT CALLBACK LRESULT CALLBACK WndProcWndProc(HWND HWND hwndhwnd,UINT message,UINT message,WPARAM WPARAM wParamwParam,LPARAM LPARAM lParamlParam)switch(message)switch(message)case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);default:default:/默认时采用系统消息默认处理函数默认时采用系统消息默认处理函数 return return DefWindowProc(hwnd,message,wParam,lParamDefWindowProc(hwnd,message,wParam,lParam););