windows编程基础.pptx_第1页
windows编程基础.pptx_第2页
windows编程基础.pptx_第3页
windows编程基础.pptx_第4页
windows编程基础.pptx_第5页
免费预览已结束,剩余116页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

临沂大学信息学院丁林花,1,VC+主要是用来开发Windows应用程序的。Windows应用程序主要有窗口应用程序和控制台应用程序。,知新,临沂大学信息学院丁林花,2,控制台应用程序是一种DOS-Like程序。,知新,临沂大学信息学院丁林花,3,Windows窗口程序设计不同于DOS下的程序设计,它是一种事件驱动的程序设计模式,主要是基于消息的。,知新,临沂大学信息学院丁林花,4,Windows应用程序,MicrosoftWindows是一种基于图形用户界面的多任务操作系统。系统中可以同时运行多个应用程序。每个Windows应用程序通过各自的“窗口”与用户进行交互。应用程序的用户界面单文档用户界面多文档对话框消息驱动的程序结构,临沂大学信息学院丁林花,5,Windows应用程序,事件驱动程序与过程驱动程序DOS过程驱动程序是顺序的、关联的,程序直接控制程序事件和过程顺序,以某种不可改变的顺序进行工作,交互性差。Windows事件驱动程序由事件发生来控制逻辑,事件的发生是随机的不确定的。,临沂大学信息学院丁林花,6,Windows应用程序,临沂大学信息学院丁林花,7,Windows应用程序,临沂大学信息学院丁林花,8,Windows应用程序,临沂大学信息学院丁林花,9,Windows应用程序,临沂大学信息学院丁林花,10,Windows应用程序,临沂大学信息学院丁林花,11,Windows应用程序,临沂大学信息学院丁林花,12,Windows应用程序,临沂大学信息学院丁林花,13,临沂大学信息学院丁林花,14,VisualC+,Windows环境下最主要的应用开发系统之一。C+语言的可视化集成开发环境。强大的调试功能为大型复杂软件的开发提供了有效的排错手段。,临沂大学信息学院丁林花,15,创建Windows窗口应用程序(withVC+),使用PlatformSDK(WindowsAPI)使用Microsoft提供MFC类库(MicrosoftFoundationClasses)使用WindowsForms一种基于窗体的开发机制用于创建在CLR中执行的应用程序使用C+/CLI而非标准C+.NETFramework,临沂大学信息学院丁林花,16,创建Windows窗口应用程序(withVC+),PlatformSDK(softwaredevelopkit),使用C/C+语言和Win32API(ApplicationProgrammingInterface,应用程序编程接口)函数进行编程。,MFC,使用C+语言和MFC(微软基础类库)进行编程.,临沂大学信息学院丁林花,17,创建Windows窗口应用程序(withVC+),临沂大学信息学院丁林花,18,创建Windows窗口应用程序(withVC+),PlatformSDK(softwaredevelopkit),使用C/C+语言和Win32API(ApplicationProgrammingInterface,应用程序编程接口)函数进行编程。,MFC,使用C+语言和MFC(微软基础类库)进行编程.,临沂大学信息学院丁林花,19,创建Windows窗口应用程序(withVC+),SDK,MFC,简单、易于理解,工作量大、效率低,复杂,代码可读性差,工作量小,效率高,临沂大学信息学院丁林花,20,创建Windows窗口应用程序(withVC+),SDK编程方式易于理解Windows工作原理。,通过了解相对已“过时”的WindowsSDK编程,有助于理解以后的很多东西!,临沂大学信息学院丁林花,21,VC+开发Windows窗口应用程序必须跨越的四大技术障碍(MFC方式)面向对象观念与C+语言Windows程序基本观念MicrosoftFoundationClasses(MFC)本身VisualC+集成开发环境与各种开发工具(难度不高,但需熟练),创建Windows窗口应用程序(withVC+),临沂大学信息学院丁林花,22,第一部分Windows编程基础,临沂大学信息学院丁林花,23,Windows编程基础,Windows程序内部运行原理SDK方式编写Windows应用程序Windows应用程序特性,临沂大学信息学院丁林花,24,CH1.1Windows程序内部运行原理,目标:理解Windows程序的运行机制掌握以下基本概念窗口WindowsAPI消息与消息机制消息响应句柄,临沂大学信息学院丁林花,25,Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系,临沂大学信息学院丁林花,26,WindowsAPI,操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用(Systemcall),这些函数的集合就是Windows操作系统提供给应用程序编程的接口(ApplicationProgrammingInterface),简称WindowsAPI。,临沂大学信息学院丁林花,27,WindowsAPI,WindowsAPI的作用是Windows系统与Windows应用程序间的标准程序接口Windows应用程序可以利用标准大量API函数调用系统功能窗口管理函数:实现窗口的创建、移动和修改功能系统服务函数:实现与操作系统有关的多种功能图形设备(GDI)函数:实现与设备无关的图形操作功能,临沂大学信息学院丁林花,28,Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系,临沂大学信息学院丁林花,29,消息响应,操作系统能够感知输入设备的变化(事件),并且能够知道具体的事件情况,但操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是消息响应。,临沂大学信息学院丁林花,30,消息,操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序。,临沂大学信息学院丁林花,31,消息结构体,MSG结构定义如下:,typedefstructtagMSGHWNDhwnd;/窗口句柄UINTmessage;/主消息WPARAMwParam;/附加消息LPARAMlParam;DWORDtime;/送至队列的时间POINTpt;/消息发送时屏幕光标的位置MSG,*PMSG;,临沂大学信息学院丁林花,32,从变量的类型区分变量的用途,intx,y;x=50;y=30;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重等等。,typedefintWIDTHtypedefintHEIGHTWIDTHx;HEIGHTy;/好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。,临沂大学信息学院丁林花,33,消息结构体,MSG结构定义如下:,typedefstructtagMSGHWNDhwnd;/窗口句柄UINTmessage;/主消息WPARAMwParam;/附加消息LPARAMlParam;DWORDtime;/送至队列的时间POINTpt;/消息发送时屏幕光标的位置MSG,*PMSG;,临沂大学信息学院丁林花,34,Windows对象,Windows窗口是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。WindowsObject是Windows系统的内部结构,是Windows的规范部件,包括各种窗口、菜单、按钮、对话框以及程序模块等,通过一个句柄来引用。,临沂大学信息学院丁林花,35,句柄(Handle),句柄(HANDLE),Windows用来标识被应用程序建立或使用的Windows对象的一个唯一的整数值。操作系统要管理和操作这些Windows对象(资源),都是通过句柄来找到对应的对象。按Windows对象的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号(整数值)即窗口句柄。,临沂大学信息学院丁林花,36,消息结构体,typedefstructtagMSGHWNDhwnd;/窗口句柄UINTmessage;/主消息WPARAMwParam;/附加消息LPARAMlParam;DWORDtime;/送至队列的时间POINTpt;/消息发送时屏幕光标的位置MSG,*PMSG;,临沂大学信息学院丁林花,37,主消息,由事先定义好的消息名标识采用不同的前缀符号来区别能够解释和处理消息的窗口类型WM_窗口消息BM_按钮控制消息CB_组合框控制消息DM_默认下压式按钮控制消息EM_编辑控制消息LB_列表框控制消息SMB_滚动条控制消息,临沂大学信息学院丁林花,38,附加消息,与主消息有关wParamlParam,临沂大学信息学院丁林花,39,消息结构体,typedefstructtagMSGHWNDhwnd;/窗口句柄UINTmessage;/主消息WPARAMwParam;/附加消息LPARAMlParam;DWORDtime;/送至队列的时间POINTpt;/消息发送时屏幕光标的位置MSG,*PMSG;,临沂大学信息学院丁林花,40,消息结构体,对于MSG这个结构体来说,它里面包含的信息是相当丰富的,它包含了对于一个消息来说,它和哪一个窗口相关,这个消息本身是什么,这个消息的附加参数是什么,消息发生投递的时间是什么。我们拿到这样一个消息就像当全面了。那么我们就知道应该做什么样的处理。,临沂大学信息学院丁林花,41,Windows应用程序,操作系统,计算机硬件输入输出设备之间的相互关系,临沂大学信息学院丁林花,42,消息队列,对于每一个应用程序,操作系统会给它建立一个消息队列。这个队列实际上是一个先进先出的缓冲区,通常是一个某种变量类型的数组。消息队列中的每个元素都是一条消息。操作系统将生成的每个消息按先后顺序放进消息队列中。应用程序总是依次取走队列里的第一条消息。应用程序取走消息后便能够知道用户的操作和程序状态的变化,从而对特定的消息进行处理(编写代码)消息响应。,临沂大学信息学院丁林花,43,临沂大学信息学院丁林花,44,应用程序获得的消息,进队消息进队消息是由Windows放入程序的消息队列中的不进队消息不进队消息直接发送给窗口过程,临沂大学信息学院丁林花,45,CH1.2SDK方式编写Windows应用程序,目标:能够用SDK(WindowsAPI+C/C+)编写一个简单的Windows应用程序,通过编写程序掌握Windows程序的运行原理及编写方式。为MFC的学习打下基础。掌握以下基本知识:Windows应用程序基本结构,临沂大学信息学院丁林花,46,程序执行的起点(入口函数)?,main(),WinMain(),临沂大学信息学院丁林花,47,WinMain函数,Windows程序的入口函数intWINAPIWinMain(HINSTANCEhInstance,/handletocurrentinstanceHINSTANCEhPrevInstance,/handletopreviousinstanceLPSTRlpCmdLine,/commandlineintnCmdShow/showstate);,临沂大学信息学院丁林花,48,匈牙利表示法,一种命名约定匈牙利命名法是微软推广的一种关于变量、函数、对象、前缀、宏定义等各种类型的符号的命名规范。匈牙利命名法的主要思想是:在变量和函数名中加入前缀以增进人们对程序的理解。为纪念Microsoft程序员CharlesSimonyi所使用的命名约定,临沂大学信息学院丁林花,49,命名约定,常用的命名约定有三种:Unix环境常用的命名法my_age、num_of_student驼峰式命名法myAge、numOfStudent匈牙利标记法iMyCar、bIsRight,临沂大学信息学院丁林花,50,WinMain函数,Windows程序的入口函数intWINAPIWinMain(HINSTANCEhInstance,/handletocurrentinstanceHINSTANCEhPrevInstance,/handletopreviousinstanceLPSTRlpCmdLine,/commandlineintnCmdShow/showstate);,临沂大学信息学院丁林花,51,函数调用约定,函数调用是通过堆栈来实现的。在调用时,将参数值和调用后的返回地址压入所分配的堆栈空间中。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。在参数传递中,有两个很重要的问题必须得到明确说明:当参数个数多于一个时,按照什么顺序把参数压入堆栈函数调用后,由谁来把堆栈恢复原装(堆栈清除),临沂大学信息学院丁林花,52,main()调fun()结束,fun()返回,保存:返回地址当前现场,恢复:主调程序现场返回地址,函数的调用,临沂大学信息学院丁林花,53,.,参数n,参数1,返回地址,被保存的%ebp,被保存寄存器、本地变量和临时变量,参数构造区域,较早的帧,调用者的帧,当前帧,地址增大,栈底,栈顶,帧指针%ebp,栈指针%esp,临沂大学信息学院丁林花,54,函数调用过程的三个步骤调用参数和返回地址(当前EIP)压栈,当前EBP压栈跳转到函数入口,开始执行被调函数恢复调用者原有栈,并跳到堆栈中保存的返回地址,低地址方向,其他数据,例如被调函数的局部变量,EIP,被调函数的参数,其他数据,例如上层函数的局部变量,SHE指针,高地址方向,EBP,Windows系统的栈,函数的调用,临沂大学信息学院丁林花,55,函数调用过程示例,2,1,Ret-add,ebp,retVal,Stackframe,临沂大学信息学院丁林花,56,函数调用约定,在高级语言中,通过函数调用约定来说明这两个问题。常见的调用约定有:stdcallcdeclfastcallthiscallnakedcall,临沂大学信息学院丁林花,57,函数调用约定,临沂大学信息学院丁林花,58,窗口的创建,创建一个完整的窗口需要经过下面四个操作步骤:设计一个窗口类;注册窗口类;创建窗口;显示及更新窗口。,临沂大学信息学院丁林花,59,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,60,窗口类的类型,在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。,临沂大学信息学院丁林花,61,如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW|CS_HREDRAW|CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反()之后再进行与(/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,63,窗口过程函数,窗口过程函数用来对消息进行处理第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。,临沂大学信息学院丁林花,64,回调函数,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。,临沂大学信息学院丁林花,65,窗口过程函数,对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。,临沂大学信息学院丁林花,66,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,67,WNDCLASS,类附加空间(cbClsExtra)Windows为系统中每一个窗口类管理一个WNDCLASS结构。在应用程序注册一个窗口类时,它可以让Windows系统为该结构分配和追加一定字节数的附加内存空间,这部分内存称之为类附加内存,由属于这种窗口类的所有窗口共享,类附加内存空间用于存储类的附加信息。函数SetClassWord和SetClassLong用来把某一个值复制到类附加内存中,并可以通过GetClassWord和GetClassLong来检取这些值。,临沂大学信息学院丁林花,68,WNDCLASS,窗口附加空间(cbWndExtra)Windows为每一个窗口管理一个内部数据结构,在注册一个窗口类时,应用程序能够指定一定字节的附加内存空间,称为窗口附加内存。在创建这类窗口时,Windows系统就为窗口结构分配和追加指定数目的窗口附加内存空间,应用程序可以用这部分内存存储窗口特有的数据。函数SetWindowWord和SetWindowLong可以把某一个值复制到附加内存,函数GetWindowWord和GetWindowLong可以检取这些值。,临沂大学信息学院丁林花,69,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,70,LoadIcon,LoadIcon的作用是在应用程序中加载一个窗口图标,其原型为:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName);,图标资源名或系统预定义图标标识名,图标资源所在的模块句柄,NULL则使用系统预定义图标,临沂大学信息学院丁林花,71,基于资源的程序设计,Windows程序分为“程序代码”和“用户接口(UI)资源”两大部分。程序代码使用编译器编译,用户接口资源使用资源编译器编译,最后两者使用连接器加上库文件可以生成可执行文件。,临沂大学信息学院丁林花,72,基于资源的程序设计,用户接口(UI)资源是指功能菜单、对话框、程序图标、光标等资源,它是Windows应用程序界面的重要组成部分。资源的使用极大方便了应用程序界面的设计,也大大方便了应用程序与用户的交互。这些用户资源的实际内容(二进制代码)是借助各种工具产生的。并以各种扩展名的文件存在,如.ico,.bmp,.cur等。程序员必须在一个所谓的资源描述文档(.rc)中描述它们。RC编译器读取RC文件的描述后,将所有用户接口资源文件集中制作一个.RES文件。这些资源可以使用VC+提供的资源编辑器来实现创建和编辑。,临沂大学信息学院丁林花,73,资源,资源分类菜单WM_COMMAND消息wParam低16位传递菜单项资源ID对话框WM_COMMAND消息wParam低16位传递子窗口(控件)资源ID资源ID资源的唯一标识,临沂大学信息学院丁林花,74,基于资源的程序设计,临沂大学信息学院丁林花,75,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,76,LoadCursor,LoadCursor的作用是在应用程序中加载一个窗口光标,其原型为:HCURSORLoadCursor(HINSTANCEhInstance,LPCTSTRlpCursorName);,光标资源所在的模块句柄,NULL则使用系统预定义光标,光标资源名或系统预定义光标标识名,临沂大学信息学院丁林花,77,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,78,GetStockObject,GetStockObject的作用是获取笔、画刷、调色板、字体的句柄。应用程序调用函数GetStockObject获取系统提供的背景刷。其原型为:HGDIOBJGetStockObject(intfnObject/typeofstockobject);,临沂大学信息学院丁林花,79,创建窗口第一步,窗口类的定义WNDCLASS,typedefstructtagWNDCLASSUINTstyle;/窗口类风格WNDPROClpfnWndProc;/窗口过程函数intcbClsExtra;/在类结构中预留的空间intcbWndExtra;/在Windows内部预留空间HINSTANCEhInstance;/程序实例句柄HICONhIcon;/窗口的图标HCURSORhCursor;/光标句柄HBRUSHhbrBackground;/背景色LPCTSTRlpszMenuName;/窗口类菜单LPCTSTRlpszClassName;/窗口类名WNDCLASS,*PWNDCLASS;,临沂大学信息学院丁林花,80,菜单,Windows应用程序加载菜单的方法:在窗口类的定义中加载菜单资源wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);在创建窗口时加载菜单HMENUhMenu;hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)动态加载菜单:应用程序通过调用函数LoadMenu获取菜单句柄后,还可通过SetMenu动态加载菜单。,临沂大学信息学院丁林花,81,创建窗口第二步,注册窗口类RegisterClass,ATOMRegisterClass(CONSTWNDCLASS*lpWndClass);,临沂大学信息学院丁林花,82,创建窗口第三步,创建窗口实例CreateWindow,HWNDCreateWindow(LPCTSTRlpszClassName,/窗口类名LPCTSTRlpszTitle,/窗口标题名DWORDdwStyle,/创建窗口的样式intx,y,/窗口左上角坐标intnWidth,nHeight,/窗口宽度和度高HWNDhwndParent,/该窗口的父窗口句柄HWENUhMenu,/窗口主菜单句柄HINSTANCEhInstance,/创建窗口的应用程序当前句柄LPVOIDlpParam/指向一个传递给窗口的参数值的指针),临沂大学信息学院丁林花,83,窗口样式,临沂大学信息学院丁林花,84,菜单,Windows应用程序加载菜单的方法:在窗口类的定义中加载菜单资源wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);在创建窗口时加载菜单HMENUhMenu;hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1)动态加载菜单:应用程序通过调用函数LoadMenu获取菜单句柄后,还可通过SetMenu动态加载菜单。,临沂大学信息学院丁林花,85,创建窗口第四步,显示窗口ShowWindow,BOOLShowWindow(HWNDhWnd,intnCmdShow);,临沂大学信息学院丁林花,86,创建窗口第五步,刷新窗口UpdateWindow,BOOLUpdateWindow(HWNDhWnd);,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。UpdateWindow(hwnd);,临沂大学信息学院丁林花,87,建立消息循环,Windows应用程序的运行以消息为核心,应用程序必须读取应用程序消息队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,完成这一任务的便是消息循环。,临沂大学信息学院丁林花,88,建立消息循环,从消息队列中获取消息GetMessage翻译消息和派遣消息TranslateMessageDispatchMessage,临沂大学信息学院丁林花,89,临沂大学信息学院丁林花,90,建立消息循环,临沂大学信息学院丁林花,91,GetMessage,从消息队列中读取一条消息,并将消息放在MSG结构中,其中函数GetMessage形式为:GetMessage(lpMSG,/指向MSG结构的指针hwnd,nMsgFilteMin,/用于消息过滤的最小消息号值nMsgFilterMax/用于消息过滤的最大消息号值),返回零值,即检索到WM_QUIT消息,程序结束循环并退出,临沂大学信息学院丁林花,92,临沂大学信息学院丁林花,93,窗口过程,窗口过程函数用来对消息进行处理,LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);,临沂大学信息学院丁林花,94,窗口函数的一般形式如下:LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessgae,WPARAMwParam,LPARAMlParam)switch(message)message为标识的消息casebreak;caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);return(0);,在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数:voidPostQuitMessage(intnExitCode)/nExitCode为应用程序的退出代码,为未定义处理过程的消息提供缺省处理,临沂大学信息学院丁林花,95,程序执行流程,临沂大学信息学院丁林花,96,格式化字符串函数,格式化字符串的函数sprintfstdio.h,charszChar20;sprintf(szChar,charis%d,wParam);,临沂大学信息学院丁林花,97,MessageBox函数,用于显示信息,int/返回用户所选按钮代表的数值MessageBox(HWNDhWnd,/窗口句柄LPCTSTRlpText,/消息框主体显示的文本LPCTSTRlpCaption,/消息框标题栏显示文本UINTuType/代表消息框风格的常数组合);,临沂大学信息学院丁林花,98,消息框风格,以MB_开始的常数组合代表消息框的风格多种风格之间用“|”分隔,if(IDOK=MessageBox(NULL,是否退出本程序?,退出,MB_OKCANCEL|MB_ICONQUESTION)MessageBox(NULL,再见!,退出,MB_OK);,临沂大学信息学院丁林花,99,GDI简介图形设备接口,Windows应用程序中的图形输出流程应用程序提出绘图请求GDI接受请求并传递给对应设备的驱动程序设备驱动程序完成特定的硬件输出,临沂大学信息学院丁林花,100,GDI简介,绘图机制绘图函数(如:Ellipse、TextOut)绘图工具(画笔、画刷等)(GDIObject)设备上下文(绘图环境)(DeviceContext),获得绘图环境,构造绘图工具,绘图,临沂大学信息学院丁林花,101,应用程序每一次文字图形操作均参照设备描述表中的属性进行。设备描述表描述了特定输出设备状态、文本和图形的绘图参数等;包括设备上可使用的输出区域、逻辑坐标系、选定何种绘图工具绘图、绘图前景色、填充色、字体、字体颜色、字的磅数等属性。,设备描述表(Devicecontext),临沂大学信息学院丁林花,102,画笔HPEN,创建画笔将画笔选入DC删除画笔资源,HPENhPen;hPen=CreatePen(S_SOLID,2,RGB(255,0,0);/线形,线宽,颜色,SelectObject(hdc,hPen);,DeleteObject(hPen);,临沂大学信息学院丁林花,103,画刷HBRUSH,创建画刷将画刷选入DC删除画刷资源,HBRUSHhBrush;hBrush=CreateSolidBrush(RGB(255,0,0);,SelectObject(hdc,hBrush);,DeleteObject(hBrush);,临沂大学信息学院丁林花,104,GDI简介,要在窗口的客户区绘图,可以使用Windows的图形设备接口(GDI)函数每个GDI函数都需要将设备描述表句柄作为函数的第一个参数,例如DrawText(HDC,LPCTSTR,int,LPRECT,UINT);TextOut(HDC,int,int,LPCTSTR,int);,临沂大学信息学院丁林花,105,画线,画线LineToLineTo(HDC,int,int);例:LineTo(hdc,100,100);默认情况下从(0,0)开始画移动画笔MoveToExMoveToEx(HDC,int,int,LPPOINT);,临沂大学信息学院丁林花,106,画其它图形,画椭圆Ellipse(hdc,100,100,200,200);画圆角矩形RoundRect(hdc,);画弧Arc(hdc,);画饼Pie(hdc,);画矩形Rectangle(HDC,int,int,int,int);,临沂大学信息学院丁林花,107,获取设备描述表:方法一,该方法适合于处理非WM_PAINT消息用GetDC获取设备描述表句柄用ReleaseDC释放设备描述表句柄这种获取设备描述表的一般方式如下,hdc=GetDC(hwnd);ReleaseDC(hwnd,hdc);,临沂大学信息学院丁林花,108,WM_PAINT消息,什么时候向窗口过程发送WM_PAINT消息(窗口发生重绘)“无效”的时候调用UpdateWindow函数刷新窗口窗口的全部或者部分失效的时候窗口从无到有手动刷新窗口调用InvalidateRect函数,临沂大学信息学院丁林花,109,获取设备描述表:方法二,该方法只适合于处理WM_PAINT消息用BeginPaint“使无效窗口生效”并“返回设备描述表句柄”用EndPaint释放设备描述表句柄一般处理WM_PAINT的形式如下:,CaseWM_PAINT;hdc=BeginPaint(hwnd,临沂大学信息学院丁林花,110,PAINTSTRUCT结构,Windows系统为每一个窗口建立了一个PAINTSTRUCT结构。该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效区域执行更新的操作。P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论