Windows编程基础和MF.ppt
《Windows编程基础和MF.ppt》由会员分享,可在线阅读,更多相关《Windows编程基础和MF.ppt(134页珍藏版)》请在装配图网上搜索。
第9章Windows编程基础和MFC编程基础,主要内容,基础知识简单的Windows编程(API)MFC编程基础,1.基础知识,基本概念,窗口和程序进程与线程句柄API与SDK事件及消息,窗口和程序,窗口是Windows本身以及Windows环境下的应用程序的基本界面单位。很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。其实窗口的概念很广,例如按钮和对话框等也是窗口,只不过是一种特殊的窗口。,窗口,窗口(Window)由句柄唯一标识。Windows程序的基本操作单元。系统管理应用程序的基本单位。应用程序与用户交互的接口环境。应用程序的运行就是窗口内部、窗口之间、窗口与系统之间数据处理与交换的过程。一个Windows程序至少有一个窗口。,窗口的组成,应用程序的主窗口,窗口,窗口,窗口,窗口,窗口,窗口的组成,窗口是屏幕上的一个矩形区域应用程序在该区域中显示数据并等待鼠标点击Windows应用系统的用户界面可以包含许多窗口每个窗口都有不同的特点,但都是互相联系的,三种类型的窗口,在这么多窗口中,基本类型只有三种:重叠(Overlapped)窗口弹出(Popup)窗口子(Child)窗口在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的,三种类型的窗口,重叠窗口通常用于建立应用程序主窗口。事实上,有时也叫做“主”窗口或者“框架”窗口弹出窗口通常以对话框和消息框的形式与用户对话子窗口通常用在视图(View)中,如在文本编辑器中的文本显示,也用在控件中,如在对话框中的OK按钮而对那些看起来像按钮或控件的子窗口,也称为“控件”窗口,三种窗口组成的应用程序,属于桌面的重叠窗口,也称主窗口,主窗口的子窗口,主窗口的子窗口,主窗口的弹出窗口,弹出窗口的子窗口,三种类型的窗口,主要区别重叠窗口和弹出窗口弹出窗口出现时可以没有标题(也称为标题栏)子窗口与重叠窗口、弹出窗口子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉另外,子窗口是唯一不能有菜单条的窗口,程序,通常说的程序都是指一个能让计算机识别的文件。接触得最多的是以exe或者com作为扩展名的文件。,进程与线程,进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。一个以exe作为扩展名的文件,在没有被执行的时候称之为应用程序,当用鼠标双击执行以后,就被操作系统作为一个进程执行了。当关机或者在任务栏的图标上单击鼠标右键选“退出”时,进程便消亡,彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。,Windows任务管理器进程,线程,线程是进程的一个执行单元。同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。进程本来就具有动态的含义,是通过线程来体现的。,Windows应用程序,操作系统,计算机硬件之间的相互关系,向下的箭头1表示操作系统能够操纵输出设备,以执行特定的功能,如让声卡发出声音,让显卡画出图形。向上的箭头2表示操作系统能够感知输入设备状态的变化,如鼠标移动,键盘按下,并且能够知道鼠标移动的具体位置,键盘按下的哪个字符。这就是操作系统和计算机硬件之间的交互关系,应用程序开发者通常不需知道其具体实现细节。,API与SDK,API是英文ApplicationProgrammingInterface的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口在编程时可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了SDK是英文SoftwareDevelopmentKit的缩写,意思是“软件开发工具包”微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等,关于API,向下的箭头表示应用程序可以通知操作系统执行某个具体的动作。如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。,关于API,应用程序是如何通知操作系统执行某个功能的呢?在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口WindowsAPI。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。,事件及消息,事件(Event)是对计算机操作的动作。每个事件对应一个消息,即每个事件发生的效果是产生消息。消息(Message)是描述事件发生的信息。比如:按键事件按下键的消息、字符消息和键弹起的消息程序执行的顺序取决于事件发生的顺序,但是消息的产生并不要求有次序之分。,事件驱动编程方法,事件驱动编程方法对于编写交互式程序很有用处,它避免了死板的操作模式。Windows程序设计是针对事件或消息的处理进行。,消息(Message),向上的箭头表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。,消息(Message),消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息。鼠标被移动会产生WM_MOUSEMOVE消息;鼠标左键被按下会产生WM_LBUTTONDOWN的消息;鼠标右键按下便产生WM_RBUTTONDOWN消息等。,消息的功能,功能帮助Windows实现多任务。通知应用程序某一事件已经发生,各应用程序给予响应。,消息的组成,操作系统是怎样将感知到的事件传递给应用程序呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。消息的组成:消息号字参数长字参数消息号事先定义好。字参数(wParam)长字参数(lParam)提供附加信息,含义和具体消息号相关。,典型的消息结构,typedefstructtagMSGHWNDhwnd;/接收窗口UINTmessage;/消息标识WPARAMwParam;/附加信息LPARAMlParam;/附加信息DWORDtime;/发送时间POINTpt;/鼠标位置MSG,*PMSG;/vcincludewtypes.h,句柄(HANDLE),句柄(HANDLE):资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。,句柄,句柄是一个指针通过句柄就可以控制该句柄指向的对象编写程序总是要和各种句柄打交道的句柄(handle)是一个4字节长的整数值是系统用于表示应用程序中不同的对象和同类对象中不同的实例。如一个窗口、按钮、图标、菜单等这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。,常用的句柄,消息驱动机制,DOS程序是通过调用系统的函数来获得用户输入。Windows程序则是通过操作系统发送的消息来处理用户输入在Windows操作系统环境内系统产生的动作用户运行应用程序产生的动作,事件产生的消息,消息驱动机制,Windows程序接收消息分发消息处理消息,与用户进行交互,消息的产生,用户产生消息Windows本身产生消息应用程序本身产生消息其他应用程序产生消息,消息的分类,窗口管理消息、初始化消息、输入消息、系统消息等。VC定义不同的前缀用于消息宏定义识别消息类型。BM按钮消息CB组合框消息DM下压按钮控制消息EM编辑框消息LB列表框消息WM窗口消息,不同消息类型的取值范围,Windows应用程序常用消息,WM_LBUTTONDOWNWM_KEYDOWNWM_CREATWM_CLOSEWM_DISTORYWM_QUITWM_PAINTWM_CHARWM_COMMAND,Windows应用程序常用消息,窗口管理消息初始化消息输入消息系统消息剪贴板消息控制处理消息,控制通知消息滚动条通知消息非用户区消息MDI消息DDE消息应用程序自定义的消息,消息的传递,Windows系统有一个存放消息的队列。每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中。然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。,消息的传递,事件,事件,事件,系统消息队列,应用程序队列,应用程序队列,应用程序队列,应用程序,应用程序,应用程序,一个应用程序队列,Windows,InputMessage,SystemQueue,ApplicationQueue,WinMain(),MessageLoop,WindowsFunction,两个应用程序队列,Windows,InputMessage,SystemQueue,ApplicationQueue,ApplicationQueue,WinMain(),MesaageLoop,WindowsFunction,WinMain(),MesaageLoop,WindowsFunction,结束一个应用程序,WM_DESTROY,Windows,WM_QUIT,ApplicationQueue,WindowsFunction,Application,WinMain(),MessageLoop,创建消息循环,Windows程序至少包含两个函数:WinMain():必有且仅有一个窗口函数:每个窗口对应一个窗口函数,以响应该窗口的消息通常每个Windows应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件,创建消息循环,While(GetMessage(/将消息发送给窗口过程,例程中指WndProc何时退出?/当从应用程序消息队列中检取的消息是/WM_QUIT时,则退出循环,投递和发送消息,PostMessage和SendMessagePostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行这是个异步消息投放函数,会造成消息的滞后性SendMessage必须等待其他程序处理消息完了之后才返回,继续执行这是个同步消息投放函数,不会造成消息的滞后性但如果消息处理失败,则会造成程序停止PostMessage的返回值表示PostMessage函数执行是否正确SendMessage的返回值表示其他程序处理消息后的返回值,投递和发送消息图示,Windows,SystemQueue,ApplicationQueue,WinMain(),MesaageLoop,WindowsFunction,PostMessage(),SendMessage(),Application,投递和发送消息示例,PostQuitMessage(nExitCode)功能:发送WM_QUIT消息给系统,以通知系统应用程序要结束。WM_QUIT消息只能用PostMessage,因为该消息将导致应用程序释放消息环,也就无法返回结果。SendDlgItemMessage()功能:向对话框控件发送消息相当于先用GetDlgItem()得到控件句柄,再SendMessage(),是一种组合的方便方式。,VC6.0下三种编程方式,控制台编程(DOS编程)Win32ConsoleApplicationWindowsAPI编程:Win32ApplicationMFC编程:MFCAppWizard(exe),VisualC+开发环境,标题栏,菜单栏,工具栏,项目工作区窗口,文档窗口,工具栏,输出窗口,输出窗口标签,状态栏,开发环境的菜单功能,File菜单中的命令主要用来对文件和项目进行操作Edit菜单中的命令是用来使用户便捷地编辑文件内容View菜单中的命令主要用来改变窗口和工具栏的显示方式,激活调试时所用的各个窗口等Insert菜单中的命令主要用于项目及资源的创建和添加,开发环境的菜单功能,Project菜单中的命令主要用于项目的一些操作Build菜单中的命令主要用来应用程序的编译、连接、调试、运行Tools菜单中的命令主要用于选择或定制开发环境中的一些实用工具Windows菜单中的命令主要用于文档窗口的操作VisualC+提供了大量详细的帮助信息,MFC,API,控制台(DOS),File菜单,VC6.0可以创建的项目类型,开发环境的工具栏,标准工具栏类向导工具栏小型编译连接工具栏工具栏的显示与隐藏、浮动与停泊“Customize”对话框方式(Tools-Customize)快捷菜单方式(任何工具栏处右击鼠标),2.Windows编程基础,Windows编程基础和MFC编程基础,利用VisualC+开发面向对象Windows应用程序有两种主要方法:一种是使用Windows提供的WindowsAPI(ApplicationProgrammingInterface,应用程序编程接口)函数,另一种是利用Microsoft提供的MFC(MicrosoftFoundationClass,微软基础类库)类库。WindowsAPI是Windows系统和应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参数定义和消息格式等。MFC类库包括用来开发C+应用程序和Windows应用程序的一组类,这些类用来表示窗口、对话框等标准的Windows部件,封装了大部分的WindowsAPI函数。,9.1Windows编程基础,Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。它的运行机制是“消息传递,事件驱动(messagebased,eventdriven)”。1.消息传递2事件驱动3.WindowsAPI4.Windows数据类型与变量的命名规则,1.消息传递,消息是一种报告有关事件发生的通知,类似于DOS下的用户输入。Windows应用程序是由消息驱动的。Windows操作系统允许多个任务同时运行,应用程序的输入输出由Windows统一管理;Windows系统下每一个窗口都维护一个消息队列,操作系统接收和管理所有输入消息、系统消息,并把它们发送给相应窗口的消息队列。应用程序初始化完成后,进入消息循环,维护自己的消息队列,从中取出消息,对其进行处理。编写消息处理函数是Windows编程的主要工作之一。,Windows应用程序的消息来源有以下四种(1),(1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。(2)控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。,(3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,像DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。(4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。,Windows应用程序的消息来源有以下四种(2),Windows消息,Windows消息是在Windows文件中用宏定义的常数。消息常数名通常以WM开头,格式为WM_XXX。在winuser.h中,消息结构的定义如下:typedefstructtagMSGHWNDhWnd;/指定消息发向的窗口句柄UINTmessage;/标识消息的消息值WPARAMwParam;/消息参数LPARAMlParam;/消息参数DWORDtime;/消息进入队列的时间POINTpt;/消息进入队列时鼠标指针的屏幕坐标MSG,*PMSG,NEAR*NPMSG,FAR*LPMSG;,Windows程序和Windows消息处理的基本流程,2事件驱动,Windows系统使用事件驱动的编程模式。事件用来标识发生的某件事情,主要采用以下三种方式产生:(1)通过输入设备,如键盘和鼠标。(2)通过屏幕上的可视对象,如菜单、工具栏按钮、滚动条和对话框上的控件。(3)来自Windows内部。,句柄,句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个唯一的整数值,是一个4字节长的数值,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷和文件等。由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件和图标等系统资源。常见的Windows对象句柄如表9.1所示,所有的句柄类型以H开头。,3.WindowsAPI,WindowsAPI是应用程序编程接口的英文缩写。它是大量函数加上数字常量、宏、结构、类型以及其它相关项的集合。在Windows应用程序中,调用API函数的方法同调用C库函数的方法相同,重要区别是C库函数的目标代码直接放到程序目标代码中,而API函数的目标代码则位于程序之外的某个动态链接库(DLL)中。WindowsAPI是包含在Windows操作系统中的,另外还有单独的驱动程序开发包(DDK),用来开发Windows驱动程序。因为WindowsAPI函数本身是用C语言编写的,所以C/C+编程可以很方便地利用计算机的底层资源,程序运行速度远远高于其它语言。,【例9.1】一个简单的Windows32应用程序。,#includeintAPIENTRYWinMain(HINSTANCEhInstance,HINSTANCEhPreinstance,LPSTRlpCmdLine,intnCmdshow)MessageBox(NULL,一个简单的Win32应用程序,例9.1,MB_OK);return0;,4.Windows数据类型与变量的命名规则(1),WindowsAPI自定义了一些关键字,用来定义Windows函数中的有关参数和返回值的大小和意义,通常把它们看作Windows的数据类型,常用的如表9.2所示(P222)。,说明:基本数据类型都是用大写字符来表示,以与一般C+基本数据类型相区别。数据类型的前缀是P或LP,表示是一个指针或长指针数据类型。前缀是U,表示无符号数据类型,等等。Windows还提供一些宏来处理上述基本数据类型。,4.Windows数据类型与变量的命名规则(1),在编程时,变量、函数的命名是一个极其重要的问题。好的命名方法使变量易于记忆且增加程序的可读性。Micorsoft采用匈牙利(Hungarian)命名法来命名WindowsAPI函数和变量。匈牙利命名法为C+标识符的命名定义了一种非常标准化的方式,以下述两条规则为基础:,(1)标识符的名字以一个或者多个小写字母开头,用这些字母来指定数据类型。表9.3(P223)列出了常用数据类型的标准前缀。(2)在标识符内,前缀之后就是一个或多个首字母大写的单词,这些单词明确指出源程序中那个对象的用途。例如,m_szPersonAddress表示一个人住址的类数据成员,数据类型是字符串。,4.Windows数据类型与变量的命名规则(2),从变量的类型区分变量的用途,intx,y;x=30;y=30;/x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。typedefintWIDTHtypedefintHEIGHTWIDTHx;HEIGHTy;/好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。,9.2MFC编程基础,9.2.1MFC编程概述9.2.2MFC的类层次9.2.3常用的MFC类9.2.4MFC应用程序的消息映射9.2.5一个最简单的MFC应用程序9.2.6典型的Windows应用程序,9.2.1MFC编程概述(1/3),MFC类库作为C+与Windows的接口,建立在Win32应用程序编程接口API之上,封装了大多数的API函数,主要是API中与程序结构相关的部分和最常用的部分。MFC还封装了重要的Windows扩展,如COM,ActiveX,ODBC和InternetAPIs,为这些难以编程实现的功能提供了简便方法。,MFC中的各种类结合起来构成了一个应用程序框架,它的目的是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK(SoftwareDevelopmentKit软件开发包)来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。MicrosoftVisualC+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于直观地设计用户界面;ClassWizard用来协助添加代码到框架文件;最后进行编译,则通过类库实现了应用程序特定的逻辑。,9.2.1MFC编程概述(2/3),在MFC编程中,入口函数WinMain()被封装在MFC的应用程序框架内,已经不用也不可以再定义为另一个WinMain()函数。MFC编程最好的办法是使用MFC的应用程序向导工具AppWizard。AppWizard为程序员提供了一种快捷方便的工具来定制基于MFC的应用程序框架,程序员只需以此为基础,添加与修改程序代码来实现所需功能。,9.2.1MFC编程概述(3/3),9.2.2MFC的类层次,MFC中的类可划分为根类、应用程序结构类、窗口类、OLE类、数据库类等十个大类,在其中一些大类的基础上又派生出许多子类。各个类的具体定义参见文件Afxwin.h。1.根类CObject2.MFC应用程序结构类(如CWinApp类等)3.用户界面类(控件类、绘图和打印相关类等)4.一般用途的类(文件、数据库和网络相关的类)5.集合类(数组、链表等相关的类)6.非CObject派生类(CString、CRect类等),MFC类的基本层次结构,9.2.3常用的MFC类,1字符串类CStringCString类用于描述和处理VC+中的字符串,该类没有基类。CString对象的字符串的长度是可变的,如果在程序中改变了字符串的内容,CString类会自动调整所需内存。因此,使用CString类要比使用简单的字符数组和字符指针更安全。#includeCString类的数据成员均为私有成员,不能直接使用,只需注意其方法(成员函数)和运算即可。表9.4为CString类的常用成员函数。【例9.2】CString类的使用举例。,CString类的定义在”afx.h”头文件中,使用时还应说明“UseMFCinaStaticLibrary”,形式:CString对象名;CString对象名=”字符串常量”;CString对象名(”字符串常量”);CString对象名(字符,intn);/重复产生n个相同的字符,CStrings1=C/C+程序设计;CStrings(d,5);coutc;st1=c;cout输出结果:;coutst1=!=,关系运算,st1=”ASDF”st1st3,falsetrue,取指定位置的字符将CString对象看成数组,st10st13,A/第一个字符位置为0F,4.成员函数,(1)取子串形式:CStringMid(intnFirst,intnCount)/取字符串中nFirst位置开始的nCount个字符CStringLeft(intnCount)/取字符串的左边nCount个字符CStringRight(intnCount)/取字符串的右边nCount个字符,有定义:CStrings(12345);则:s.Mid(2,2)的值为34s.Left(3)的值为123,【例】利用Left函数,输出如图所示的结果。,分析:确定每行显示字符的起始位,通过setw(n)显示一个空格的位数来实现,也可通过产生一个有若干个空格的字符串后left(n)显示n个空格来实现。显示可变的字符串,利用left(n)。,#includeiostream.h#includeafx.hvoidmain()CStringst1(,30);/产生30个空CStringst2(ABCDEFGHIJKLMNOPQRS);for(inti=1;i=10;i+)coutst1.Left(10-i)st2.Left(2*i-1)endl;,程序:,(2)查看字符串信息intFind(TCHARch);/返回指定字符在串中的位置intFind(LPCTSTRlpszSub);/返回指定子字符串在串中的位置intGetLength();/返回字符串的字符数,有定义:CStrings(ABCDEF);则:s.Find(C)的值为2s.Find(“BCD”)的值为1s.GetLengh()的值为6,(3)字符串修改voidSetAt(intnIndex,TCHARch)/用字符替换指定位置上的字符intInsert(intnIndex,TCHARch)/将字符插入到指定位置,原位置的字符右移intDelete(intnIndex,intnCount=1)/从指定位置开始删除一个或多个字符intReplace(TCHARchOld,TCHARchNew)/将新字符替换字符串中的老字符intReplace(LPCTSTRlpszOld,LPCTSTRlpszNew)/同上,区别替换的是子字符串,有定义:CStrings(ABCDEF);则:s.SetAt(1,b);couts;/输出AbCDEFs.Insert(1,b);couts;/输出AbBCDEFs.Replace(g,k);couts;/输出ABCDEFs.Replace(“BCD”,“bc”);couts;/输出AbcEF,思考:如何删除字符串中任意子字符串?,(4)转换字符串voidMakeUpper()/将字符串中的所有字符转换成大写voidMakeLower()/将字符串中的所有字符转换成小写voidMakeReverse()/将字符串中各字符的顺序倒转voidEmpty()/将字符串中的所有字符删除,有定义:CStrings(ABCabc);则:s.MakeUpper();couts;输出:ABCABCs.MakeReverse();couts;输出:cbaCBAs.Empty();couts;输出:(空),(5)格式化输出形式:voidFormat(格式字符串,输出参数列表);功能:构造一个输出的字符串。其中:“格式字符串”由输出的文字和数据格式说明符组成,文字可以是直接键入的各种字符,还可以是转义符;数据格式说明符形式:%输出宽度格式字符“输出参数列表”表示要输出的数据,其个数与类型必须与格式说明符依次对应。,有定义:CStrings;则:s.Format(a1=%d,a2=%5.2f,a3=%s,123,12.3,abc);coutUpdateWindow();最后返回TRUE,表示窗口创建成功。,InitInstance的执行过程:,理解程序代码,应用程序类CWinApp是用来调用WinMain以及进行实例的初始化,在每个MFC应用程序中有且只能有一个这样的应用程序类,且需要一个全局的对象实例,如theApp。InitInstance完成初始化工作后,接下来调用基类CWinApp的成员函数Run,执行应用程序的消息循环,即重复执行接收消息并转发消息的工作。当Run检查到消息队列为空时,将调用基类CWinApp的成员函数OnIdle进行空闲时的后台处理工作。若消息队列为空且又没有后台工作要处理时,则应用程序一直处理等待状态,一直等到有消息为止。当程序结束时,调用基类CWinApp的成员函数ExitInstance,完成终止应用程序的收尾工作。,理解程序代码,2.消息映射(MessageMap)在MFC中,一个消息的处理往往是通过独特的MFC映射机制来进行的。消息映射机制指MFC类中将消息与消息处理函数联系起来,一一对应的机制。这种机制使得应用程序处理消息变得更方便、更直接、更紧凑。在MFC中,任何一个从CCmdTarget类派生的类理论上均可处理消息,且都有相应的消息映射函数。,理解程序代码,映射一个消息的过程是由三个部分组成的:(1)在处理消息的类中,使用消息宏DECLARE_MESSAGE_MAP()声明对消息映射的支持,并在该宏之前声明消息处理函数。如:protected:Afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);DECLARE_MESSAGE_MAP(),(2)使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏在类声明之后的地方定义该类支持的消息映射入口点,所有消息映射宏都添加在这里,当然不同的消息MFC都会有不同的消息映射宏。如:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)END_MESSAGE_MAP,理解程序代码,(3)定义消息处理函数。例如:voidCMainFrame:OnLButtonDown(UINTnFlags,CPointpoint)MessageBox(你好,我的VisualC+世界!,问候,0);CFrameWnd:OnLButtonDown(nFlags,point);注:为了使消息能被其他对象接收并处理,在函数中常常需要调用基类中的相关消息处理函数。,理解程序代码,9.2.6典型的Windows应用程序,编写一个典型的Windows应用程序,一般包括以下这些内容:(1).c、.cpp源程序文件源程序文件包含了应用程序的数据、类、功能逻辑模块(包括事件处理、用户界面、对象初始化等)的定义。(2).h、.hpp头文件头文件包含了.cpp、.c源文件中所有数据、模块、类的声明。当一个.cpp、.c源文件要调用另一个.cpp、.c中所定义的模块功能时,需要包含那个.cpp、.c文件对应的头文件。,(3)资源文件包含了应用程序所使用的全部资源定义,通常以.rc为后缀名。这里所说的资源是应用程序所能够使用的一类预定义工具中的一个对象,包括:字符串资源、加速键表、对话框、菜单、位图、光标、工具条、图标、版本信息和用户自定义资源等。,MFCAppWinzard(exe)应用程序类型,单文档应用程序:类似于Windows记事本的程序,功能比较简单,复杂程序适中,每次只能打开和处理一个文档。大多数应用程序的编制都是从单文档程序框架开始的。对话框应用程序:最简单、最紧凑,没有菜单、工具栏和状态栏,也不能处理文档,但速度快,代码少。多文档应用程序:能允许同时打开和处理多个文档,相对于单文档,增加了许多功能,因而也需要大量额外的编程工作,如不仅需要跟踪所有打开文档的路径,还需要管理各文档窗口的显示和更新等。,项目和项目工作区目录结构,在VC中,项目中所有的源文件都是采用文件夹的方式进行管理的将项目名作为文件夹名,在此文件夹下包含源程序代码文件(.cpp,.h)、项目文件(.dsp)以及项目工作区文件(.dsw)等下面列出了其他一些文件类型的的含义:.opt关于开发环境的参数文件如工具条位置等信息.aps(AppStudioFile)资源辅助文件,二进制格式.clwClassWizard信息文件.dsp(DeveloperStudioProject)项目文件.plg编译信息文件.hpj(HelpProject)帮助文件项目,项目和项目工作区目录结构,.mdp(MicrosoftDevStudioProject)旧版本的项目文件.bsc用于浏览项目信息.map执行文件的映像信息纪录文件.pch(Pre-CompiledFile)预编译文件,可以加快编译速度,但是文件非常大.pdb(ProgramDatabase)记录程序有关的一些数据和调试信息.exp记录DLL文件中的一些信息,只有在编译DLL才会生成.ncb无编译浏览文件(nocompilebrowser),项目和项目工作区目录结构,还有相应的Debug或Release、Res等子文件夹VC应用程序向导创建项目时,系统会自动为项目创建Win32Debug的运行程序,并使用相应的缺省配置Win32Release版本的区别在于Debug版本的运行程序有相应的调试信息码Release版本的运行程序没有Release版本的运行程序经过代码的优化,其程序的运行速度被最大加速,项目和项目工作区,在开发环境中,VC是通过左边的项目工作区窗口来对项目进行各种管理项目工作区窗口包含三个页面ClassView页ResourceView页FileView页,项目和项目工作区,ClassView页用以显示项目中的所有的类信息假设打开的项目名为Ex_Sdi,单击项目区窗口底部的ClassView,则显示出“Ex_Sdiclasses”的树状结点。在它的前面是一个图标和一个套在方框中的符号“+”,单击符号“+”或双击图标,Ex_Sdi中的所有类名将被显示。如CMainFrame、CEx_SdiApp、CEx_SdiDoc、CEx_SdiView等,项目和项目工作区,ResourceView页包含了项目中所有资源的层次列表。每一种资源都有自己使用的图标。FileView页FileView可将项目中的所有文件分类显示。每一类文件在FileView页面中都有自己的目录项(节点)。可以在目录项中移动文件,还可以创建新的目录项以及将一些特殊类型的文件放在该目录项中。创建一个新目录项,可在添加目录项的地方右击,选择“NewFolder”,输入目录项名称和相关的文件扩展名,单击“OK”。,资源,资源的分类(1)快捷键列表(2)工具栏按钮(3)鼠标指针(4)对话框(5)HTML(6)图标(7)菜单(8)字符串列表(9)版本信息,资源基本操作,创建资源(1)从“Insert”菜单选取“Resource”;或用快捷键Ctrl+R打开对话框New用来创建一个由ResourceType列表中指定类型的新资源Custom按钮用来创建ResourceType列表中没有的新类型的资源Import按钮用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中(2)从ResourceType列表中选择一种资源类型,而后按New按钮(3)在项目工作区窗口的ResourceView页面中,看到了刚才选中的资源的缺省标识符,而且相应的资源编辑器自动打开,资源基本操作,打开资源如果需要对已有资源进行查看或修改,可以首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,双击鼠标左键或者按Enter键,这时相应的资源编辑器也会相应自动打开。保存资源当设计或修改好一个资源后,用File菜单的Save菜单命令或利用快捷键Ctrl+S将其保存在当前资源文件中。,资源基本操作,删除、复制资源如删除一个已有的资源,首先切换到项目工作区窗口的ResourceView标签页,然后选中要打开的资源,按Del键或者利用Edit菜单下的Delete菜单项可实现删除。复制资源的过程与删除类似,选中要复制的资源,按住Ctrl键不放,并拖动鼠标左键或利用Edit菜单中的Copy和Paste菜单命令进行操作,同其他软件的复制过程相同。,资源文件的管理,资源文件一经创建,其中所包含的资源也就随之而定,与资源相对应的标识符也被保存在Resource.h头文件中。一般,在一个资源文件.RC中所保存的所有资源已经满足的需要了,尽管如此,VC仍然允许用多个文件来存放资源。用View菜单中的ResourceIncludes菜单命令打开“ResourceIncludes”对话框时,可以看到Compile-timedirectives编辑框中已经含有#includeresEx_Sdi.rc2。资源编辑器所有Windows资源都可以用VC提供的资源编辑器来编辑,Windows应用程序生成的主要流程,命名规则,函数命名规则函数名=动词+名词动词和名词的第一个字母必须大写例GetMessage变量命名规则小写字母前缀表示变量的类型,其余的部分描述变量的功能例nCount,命名规则示例,数据类型定义Win32变量名BOOLint32位符号数bOkINTint32位符号数nCountUINTunsignedint32位无符号数uMsgLONGlong32位符号数lTotalSize,养成良好的编码习惯,操作数与操作符之间请空一格。若花括号可有可无,还是请写上。在花括号内部的代码要比花括号缩进一个TAB。如果你的代码已经很乱了,使用一组神奇的快捷键:Alt+F8。不要过份依赖这个快捷键,事实证明,总想偷懒的人不会有好结果。另一组快捷键可能也会用上:Shift+Tab。,程序调试,修正语法错误(F4)设置断点(F9)启用/结束调试(F5/Shift+F5)控制程序运行(F10&F11)查看和修改变量的值QuickWatch窗口的使用Watch窗口的使用Variables窗口的使用,- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 编程 基础 MF
装配图网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文