c+Windows应用程序.ppt
,第3讲 Windows应用程序 GUI程序,Visual C+程序设计,主讲:李贵荣湖北汽车工业学院,2,本讲内容,1 Windows操作系统简介2 Windows编程基础知识3 Windows消息4 Windows中的消息处理机制(事件驱动)5 Windows程序的基本结构6 应用举例,3,Windows操作系统简介,Windows操作系统的发展1983年12月首次推出Windows系统的第一个版本的,命名为Windows v1.0 1985年推出了Windows v1.1版本1987年10月,Microsoft发行了Windows系统的另一个重要版本Windows v2.01990年5月,Microsoft公司发行了一个划时代的版本Windows v3.01992年4月,Microsoft公司又推出了支持象动态数据交换、对象连接和嵌入、多媒体等功能的Windows v3.1版本,4,Windows操作系统简介,Windows操作系统的发展1995年,Microsoft公司隆重推出了Windows 951998年,Microsoft公司推出了Windows 98版本1999年12月,微软公司发行32位图形商业性质的Windows 2000操作系统,基于NT技术,Windows NT系列是纯32位操作系统,使用先进的NT核心技术,非常稳定。2000年9月,微软公司发行Windows ME是一个16位/32位混合的Windows系统。2001年8月,Windows XP是基于Windows 2000代码的产品,同时拥有一个新的用户图形界面。,5,Windows操作系统的特点,图形化的用户界面Windows系统及Windows应用程序的用户可以得到一致的用户界面所带来的许多认识的方便。多任务机制Windows向用户提供非常重要的多任务功能。硬件即插即用功能Windows提供了各种设备驱动程序支持各种各样的外部设备。与设备无关的图形图像机制,6,Windows编程基础,Windows界面,Win32操作系统为我们提供了一组预先构造好的界面元素或控件来建立GUI外观和作用相像的应用程序。这种方法使用户熟悉Windows 应用,并使用户能较容易地把操作技术的有关知识从熟悉的软件应用传递到新的不熟悉的软件应用中。我们通过编程还可以自定义控件及其式样,给界面设计人员提供创作空间。,7,Windows编程基础,Windows是一种基于图形界面的多任务操作系统。基于Windows的程序有着相同的外观和命令结构。对用户 来说,学习使用Windows应用程序变得容易了。Windows运行应用程序以硬件无关的方式来处理视频显示、键盘、鼠标、打印机、串行口以及系统时钟。尤其是标准化的图形用户界面,统一的界面使用图片或图标来代表磁盘驱动器、文件、子目 录以及其它操作系统的命令和动作。统一的用户界面也为程序员带来了好处。Windows的多任务环境允许用户在同一时刻运行多个应用程序或同一个应用程序的多个实例。一个应用程序可能处于激活状态。激活的应用程序是指它正接收用户的输入。同一时间有也只能有一个应用程序处于激活状态,但可以有任意个数的并行运行的任务。,Windows提供了大量的内建 函数以方便地使用弹出菜单、滚动条、对话框、图标和其他一些友好的用户界面应该具有的特性。,可以很方便地使用常见菜单和对话框的内建函数。所有的菜单都具有相同风格的键盘和鼠标接口,因为是Windows而不是程序员在实现它。,8,Windows编程基础开发环境,可视化开发系统集成了一系列系统可用资源和开发工具,9,Windows编程基础开发工具,面向对象编程语言C+、Java、Delphi、VB.编程对象组件(对象)窗口对话框、按钮、资源(位图、图标、字符串)开发Windows相当大的程度上在创建对象、修改组件对象的属性对象的特征静态属性+动态行为编程方法,传统编写法:API交互式方法:MFC,10,Windows编程基础API,API,API函数的功能,为应用程序提供Windows系统特殊函数及数据结构,Win应用程序可以利用标准大量API函数调用系统功能,是Win系统与Win应用程序间的标准程序接口,11,Windows编程基本概念窗口,窗口,12,Windows编程基本概念界面组件,用户界面(窗口)的组成窗口主边框和窗口子边框用户区控制菜单框标题条菜单条工具条水平滚动条和垂直滚动条最大化/还原窗口按钮最小化按钮关闭按钮状态条.,13,Windows编程基本概念界面组件,用户界面组件皆为对象将世界看成是一组彼此相关并相互通信的实体即对象组成,每个对象有一个名字来标识。例如,当看见一辆汽车时,所见到的是一辆汽车,而不是一大堆原子。可以将汽车分解为车轮、发动机、车门、油箱等,它们都是具体的实体即对象。窗口本身及其成组成部分均可以看成对象。窗口的显示样式(效果)均可以改变或设置相应组件的属性来实现;窗口的动作也由组件之间发送消息来实现。,14,Windows编程基本概念界面组件,对象之间的通信被称为发送消息。即一个对象请求另一个对象执行某种方式的操作。例如,交叉路口的红灯“请求”驾驶员停车,驾驶员在接受到消息之后,他所执行的动作是踏下制动踏板,这有向汽车发送了一条消息,汽车在接受到此消息之后,又将该消息分解之后发送到相关的对象上:制动器作用于车轮上,将动能转变成为势能,使车速降下来;尾灯又向它后面的其它车辆的驾驶员发送消息;各种仪表盘向驾驶员反馈出所发送的消息的动作结果。,15,Windows编程基本概念界面组件,从编程角度看,对象是内存中一块有名的存储单元。所谓变量就是一种数据对象,但对象的概念比变量的含义更广义,通常将对象定义成为包含有数据和代码的内存区域,数据表征对象的特征(属性),而代码用于响应消息,使对象进行某些动作(行为)。,从屏幕上显示的一个可视的窗口对象为例,我们可以对比分析一下用户心目中的对象和程序员心目中的对象的关系。窗口对象的特征,例如颜色、长度、显示的内容等,在程序中对应为数据,用户对窗口对所做的操作,例如移动窗口、改变窗口的大小等,使得用户向窗口发送了消息,这些消息引起了计算机(内存中的)对象执行相应的代码,代码执行的结果改变了对象中的数据,使对应的可视对象的位置和大小发生了变化。,16,Windows编程基本概念界面组件,发送消息类似于标准的函数调用,但消息也有函数调用中没有的特性。例如,消息始终在执行一选择机制,其参数与其它消息区别开来,从而告诉该对象完成什么样的操作。一个函数名始终指向内存中该函数的代码所位于的确定地址,消息并不指向内存中的某地址,但却告诉接受消息的对象要引用的内存地址是什么。函数不仅说明操作,而且还要执行如何完成该操作的方法。消息只说明该操作,在对象中定义的方法说明如何完成该操作。当向不同的对象发送相同的消息时,所执行的方法是不同的。,17,Windows编程基本概念句柄,句柄是Windows编程的基础。Windows应用程序中存在许多对象,例如选单、窗口、图标、内存对象、位图、刷子、设备对象和程序实例等,在Windows中,对象使用句柄进行标识,通过使用一个句柄,应用程序可以访问一个对象。所谓句柄是Windows使用的一种无重复整数。句柄主要用来标识应用程序中的一个对象。句柄只能进行赋值、与另句柄比较及是否NULL操作。,常用句柄类型及其说明,HWND窗口句柄HDC设备环境句柄HBITMAP位图句柄HCURSOR光标句柄HICON图标句柄HFONT字体句柄HMENU菜单句柄HPEN画笔句柄HFILE文件句柄HBRUSH画刷句柄HINSTANCE当前实例句柄,18,句柄,应用程序通过句柄访问相应的对象信息,19,Windows编程基本概念消息,Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换。消息内容用一个结构体MSG来描述:,typedef struct tagMSG HWND hwnd;/窗口句柄,为null,则可检索所有驻留在消息队列中的消息 UINT message;/消息值,由Windows.h头文件中的宏定义来标识 WPARAM wParam;/字参数,有关消息的附加信息,不同消息其值有所不同 LPARAM lParam;/长字参数 DWORD time;指定消息送至队列的时间 POINT pt;/指定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体MSG;,typedef struct tagPOINT LONG x;LONG y;POINT;,20,附加信息与具体消息号的值有关,在Win中消息用结构体MSG表示,21,VC中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:,BM表示按钮控制消息CB表示组合框控制消息DM表示默认下压式按钮控制消息EM表示编辑控制消息LB表示列表框控制消息SBM表示滚动条控制消息WM表示窗口消息,窗口管理消息初始化消息输入消息系统消息剪贴板消息控制处理消息控制通知消息滚动条通知消息非用户区消息MDI消息DDE消息应用程序自定义的消息,Windows编程常用消息,22,此外,相似的消息还有:WM_LBUTTONUP:放开鼠标左键时产生;WM_RBUTTONDOWN:单击鼠标右键时产生;WM_RBUTTONUP:放开鼠标右键时产生;WM_LBUTTONDBLCLK:双击鼠标左键时产生;WM_RBUTTONDBLCLK:双击鼠标右键时产生。,1.WM_LBUTTONDOWN:产生单击鼠标左键的消息,Windows应用系统常用消息,23,系统键是指实现系统操作的组合键,例如Alt与某个功能键的组合以实现系统菜单操作等。,3.WM_ CHAR:按下一个非系统键时产生的消息wParam 为按键的ASCII码1Param 与WM_KEYDOWN的相同,相似的消息还有WM_KEYUP,在放开非系统键时产生,如F1的虚拟键码在Windows.h文件中定义为VK_F1,2.WM_KEYDOWN:按下一个非系统键时产生的消息wParam:按下键的虚拟键码,用以标识按下或释放的键1Param:记录了按键的重复次数、扫描码、转移代码、先前键的状态等信息。,24,wParam:未用1Param:包含一个指向CREATESTRUCT数据结构的指针,wParam和1Param均未用。,wParam和1Param均未用。,4.WM_CREATE:由CreateWindow函数发出的消息5.WM_CLOSE:关闭窗口时产生的消息6.WM_DESTROY:由DestroyWiodow函数发出的消息,25,7.WM_QUIT:由PostQuitMessage函数发出的消息退出应用程序时发出的消息wParam:含退出代码,标识程序退出运行时的有关信息1Param:未用8.WM_PAINT,26,过程驱动方法计算平均成绩,事件驱动方法计算平均成绩,三、Windows中的事件驱动程序设计,27,一个完整的Windows应用程序通常由五种类型的文件组成。,1.C语言源程序文件2.头文件3.模块定义文件4.资源描述文件5.项目文件,四、Windows应用程序组成及编程步骤 1.应用程序的组成,28,1.所有应用程序的入口,类似Main函数,2.完成一系列的定义和初始化,并产生消息循环,WinMain和WndProc是Windows应用程序的主体,2、源程序组成结构,29,(1)WinMain函数,三个基本的组成部分:函数说明、初始化和消息循环,WinMain函数,注意!Win是多任务管理的,同一应用程序的多个窗口可能会同时存在,系统对每个窗口的执行称为一个实例并用一个实例句柄来唯一标识,30,(2)初始化,i.窗口类定义,通过给窗口类数据结构WNDCLASS赋值完成,该数据结构中包含窗口类的各种属性。窗口类定义常用以下函数:,31,LoadCursor的作用是在应用程序中加载一个窗口光标HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName),光标资源所在的模块句柄,NULL则使用系统预定义光标,光标资源名或系统预定义光标标识名,应用程序调用函数GetStockObject获取系统提供的背景刷HBRUSH GetStockObject(int nBrush);,32,ii.注册窗口类,Win系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用。窗口类的注册由函数RegisterClass()实现。RegisterClass(/wndclass为窗口类结构 RegisterClass函数的返回布尔值,注册成功则返回真,33,iii.创建窗口实例,创建一个窗口类的实例由函数CreateWindow()实现函数原型如下:HWND CreateWindow(LPCTSTR lpszClassName,窗口类名 LPCTSTR lpszTitle,窗口标题名 DWORD dwStyle,创建窗口的样式 int x,y,窗口左上角坐标 int nWidth,nHeight,窗口宽度和度高 HWND hwndParent,该窗口的父窗口句柄 HWENU hMenu,窗口主菜单句柄 HINSTANCE hInstance,创建窗口的应用程序当前句柄 LPVOID lpParam 指向一个传递给窗口的参数值的指针),34,35,iv显示窗口,窗口类的显示由ShowWindow和UpdateWindow函数实现。应用程序调用ShowWindow函数在屏幕上显示窗口ShowWindow(hwnd,nCmdshow);/nCmdshow为窗口显示形式标识,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。UpdateWindow(hwnd);,36,(3)消息循环,消息循环的常见格式如下:MSG Msg;while(GetMessage(,将消息的虚拟键转换为字符信息,将消息传送到指定窗口函数,从消息队列中读取一条消息,并将消息放在MSG结构中,其中函数GetMessage形式为:GetMessage(lpMSG,/指向MSG结构的指针 hwnd,nMsgFilteMin,/用于消息过滤的最小消息号值 nMsgFilterMax/用于消息过滤的最大消息号值),返回零值,即检索到WM_QUIT消息,程序结束循环并退出,将消息传递给窗口函数的相应过程处理,Windows将产生的消息,WinMain函数,37,WndProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。,3 窗口函数WndProc,38,窗口函数的一般形式如下:LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPARAM wParam,LPARAM lParam)switch(message)message为标识的消息 case break;case WM_DESTROY:PostQuitMessage(0);default:return DefWindowProc(hwnd,message,wParam,lParam);return(0);,在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数:void PostQuitMessage(int nExitCode)/nExitCode为应用程序的退出代码,为未定义处理过程的消息提供默认的处理,39,在Windows.h中定义了Windows 应用程序中包含种类繁多的数据类型,4数据类型,40,MSG:包含一个消息的全部信息,是消息发送的格式,WNDCLASS:包含一个窗口类的全部信息及属性,POINT:定义了屏幕上或窗口中的一个点的X和 Y坐标,RECT:定义了一个矩形区域及其左上角和右下角的坐标,几种重要的结构,5.一些重要的数据结构,41,【例3-1】创建应用程序框架。本例的目的在于说明创建Windows应用程序的方法及过程,#include/包含应用程序中所需的数据类型和数据结构的定义LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/窗口函数说明/-以下初始化窗口类-int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)HWND hwnd;MSG Msg;WNDCLASS wndclass;char lpszClassName=窗口;/窗口类名 char lpszTitle=My_Windows;/窗口标题名,五、应用程序举例,42,/窗口类的定义wndclass.style=0;/窗口类型为默认类型wndclass.lpfnWndProc=WndProc;/定义窗口处理函数wndclass.cbClsExtra=0;/窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展wndclass.hInstance=hInstance;/当前实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/窗口的最小化图标为默认图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/窗口采用箭头光标wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);/窗口背景为白色wndclass.lpszMenuName=NULL;/窗口中无菜单wndclass.lpszClassName=lpszClassName;/窗口类名为窗口,43,/-以下进行窗口类的注册 if(!RegisterClass(,/-创建窗口-hwnd=CreateWindow(lpszClassName,/窗口类名lpszTitle,/窗口实例的标题名WS_OVERLAPPEDWINDOW,/窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,/窗口左上角坐标为默认值CW_USEDEFAULT,CW_USEDEFAULT,/窗口的高和宽为默认值NULL,/此窗口无父窗口NULL,/此窗口无主菜单hInstance,/创建此窗口的应用程序的当前句柄NULL/不使用该值);,44,/-显示窗口-ShowWindow(hwnd,nCmdShow);,/-绘制用户区-UpdateWindow(hwnd);,/-消 息 循 环-while(GetMessage(/消息循环结束即程序终止时将信息返回系统,45,/窗口函数LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)switch(message)case WM_DESTROY:PostQuitMessage(0);default:/默认时采用系统消息默认处理函数 return DefWindowProc(hwnd,message,wParam,lParam);return 0;,调用PostQuitMessage发出WM_QUIT消息,46,47,48,49,50,