VisualC环境下Windows程序开发概述课件_第1页
VisualC环境下Windows程序开发概述课件_第2页
VisualC环境下Windows程序开发概述课件_第3页
VisualC环境下Windows程序开发概述课件_第4页
VisualC环境下Windows程序开发概述课件_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

第12章

VisualC++环境下Windows程序开发概述12.1VisualC++可视化集成开发环境12.2创建、组织文件、工程和工作区12.3Windows编程基础12.4Win32开发12.5MFC编程第12章VisualC++环境下Windows程序开发112.1VisualC++可视化集成开发环境12.1.1VisualC++简介12.1.2项目开发过程12.1.3集成开发环境DeveloperStudio12.1.4常用功能键及其意义返回首页12.1VisualC++可视化集成开发环境.1VisualC++简介1.VisualC++集成开发环境(IDE)集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。

2.向导(Wizard)向导是一个通过一步步的帮助引导你工作的工具。DeveloperStudio中包含三个向导。

3.MFC库库(library)是可以重复使用的源代码和目标代码的集合。MFC(MicrosoftFundamentalClasses)是VisualC++开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。

返回本节12.1.1VisualC++简介1.VisualC312.1.2项目开发过程一个用C++开发项目的通用开发过程如图12-1所示。12.1.2项目开发过程一个用C++开发项目的通用开发过4建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。返回本节建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件512.1.3集成开发环境DeveloperStudio1.进入DeveloperStudio2.DeveloperStudio的界面3.获得帮助信息4.VisualC++的编辑器12.1.3集成开发环境DeveloperStudio6图12-2DeveloperStudio界面图12-2DeveloperStudio界面7DeveloperStudio它具有以下特点:

(1)自动语法。

(2)自动缩进。

(3)参数帮助。

(4)集成的关键字帮助。

(5)拖放编辑。

(6)自动错误定位。

返回本节DeveloperStudio它具有以下特点:(1)自动812.1.4常用功能键及其意义表12-1常用功能键12.1.4常用功能键及其意义表12-1常用功能键9返回本节返回本节1012.2创建、组织文件、工程和工作区12.2.1新建工程12.2.2新建工作区12.2.3增加已有文件到工程中12.2.4打开工作区12.2.5设置当前工程返回首页12.2创建、组织文件、工程和工作区12.2.1新建1112.2.1新建工程项目工作区是一个包含用户的所有相关项目和配置的实体。工程定义为一个配置和一组文件,用以生成最终的程序或二进制文件。一个项目工作区可以包含多个工程,这些工程既可以是同一类型的工程,也可以是不同类型的工程(如VisualC++和VisualJ++工程)。工作区现在以.dsw为后缀名(以前为.mdp),项目文件现在以.dsp(以前为.mak)为后缀名。项目工作区如图12-3所示。12.2.1新建工程项目工作区是一个包含用户的所有相关项12图12-3项目工作区图12-3项目工作区13要新建一个工程,可以:(1)在File菜单上,单击New,选择Projects标签。(2)从列表中选择项目类型(3)单击CreateNewWorkspace(新建工作区)或AddtoCurrentWorkspace(加入到当前工作区中)。(4)要使新工程为子工程,可以选择Dependencyof检查框,并从列表中选择一个工程。要新建一个工程,可以:14(5)在ProjectName框中,输入新工程名,确保该名字必须与工作区中的别的工程名字不重名。(6)在Location框中,指定工程存放的目录:可以直接输入路径名,也可以单击旁边的Browse按钮,浏览选择一个路径。(7)单击Platform框中的相应检查框,指定工程的开发平台返回本节(5)在ProjectName框中,输入新工程名,确保该名1512.2.2新建工作区要创建一个空的工作区,可以:

(1)在File菜单上,单击New。(2)在随后弹出的对话框上,单击Workspace标签。(3)从类型列表中选择BlankWorkspace。(4)在WorkspaceName框中输入名字,注意名字不能与它将要包含的工程同名。(5)在Location框中指定存放工作区文件的目录。(6)单击OK。返回本节12.2.2新建工作区要创建一个空的工作区,可以:返回1612.2.3增加已有文件到工程中(1)打开包含目标工程的项目工作区文件。(2)在Project菜单上,单击AddtoProject,然后单击Files。(3)在InsertFilesintoProject对话框中,浏览并定位要加入到工程中的文件名,然后选择它们。(4)从InsertInto中选择工程名字,然后单击OK。返回本节12.2.3增加已有文件到工程中(1)打开包含目标工程的1712.2.4打开工作区选择File-OpenWorkspace,指定要打开的工作区;或选择File-RecentWorkspaces,从最近打开过的工作区列表中选择一个。返回本节12.2.4打开工作区选择File-OpenWorks1812.2.5设置当前工程选择ProjectSetting,可以为当前工程设置编译、链接和C/C++等各种选项。

返回本节12.2.5设置当前工程选择ProjectSettin1912.3Windows编程基础12.3.1WindowsAPI12.3.2Windows基础12.3.3Windows消息映射和处理返回首页12.3Windows编程基础12.3.1Windo2012.3.1WindowsAPI1.WindowsAPI的定义WindowsAPI是应用程序编程接口(ApplicationProgrammingInterface)的英文缩写。它是大量函数加上数字常量、宏、结构、类型以及其他相关项的集合。2.WindowsAPI函数的分类根据WindowsAPI函数的功能,可以将其分为三类:(1)窗口管理函数。用以实现窗口的创建、移动和修改功能。(2)图形设备(GUI)函数。用以实现与设备无关的图形操作功能。(3)系统服务函数。用以实现与操作系统有关的多种功能。返回本节12.3.1WindowsAPI1.WindowsA2112.3.2Windows基础1.事件

事件以如下三种方式产生:(1)通过输入设备,如键盘和鼠标。(2)通过屏幕上的可视对象,如菜单、工具栏按钮、滚动条和对话框上的控件。(3)来自Windows内部。2.消息但Windows捕获一个事件后,它会编写一条消息,并将相关信息放入一个数据结构中,然后将包含此数据结构的消息发送给需要此消息的程序。Windows消息是在Windows文件中用宏定义的常数。消息常数名通常以WM开头,格式为WM_XXX。12.3.2Windows基础1.事件223.绘图及设备环境Windows具有图形用户界面(GUI),它包括菜单、工具栏、滚动条和对话框中的按钮等元素。4.对象与句柄对设备环境的访问是通过Windows返回的句柄进行的。

5.坐标系要为绘制和其他任务指定位置,需要坐标系统。Windows提供了8种不同的坐标系。

返回本节3.绘图及设备环境返回本节2312.3.3Windows消息映射和处理开始执行在Windows中,管理消息的方式通常是这样的:当发生某个消息后,该消息进入消息队列,操作系统根据消息提供的信息决定由哪个应用程序来处理,该应用程序依照一定的方式查找应用程序各个类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对应关系),找到处理程序,然后由处理程序执行。图12-4是Windows程序和Windows消息的基本流程。12.3.3Windows消息映射和处理开始执行24图12-4Windows程序和Windows消息处理的基本流程图12-4Windows程序和Windows消息处理的基25Windows程序要处理的消息种类如下:(1)Windows消息。该类消息以WM_开头(WM_COMMAND例外),通常由窗口和视图来处理。

(2)由控件和其他子窗口发送给父窗口的WM_COMMAND消息。这些消息中包括EN_CHANGE通知码。(3)来自于用户界面对象的WM_COMMAND消息。这些用户界面对象包括菜单、工具栏按钮和快捷键。返回本节Windows程序要处理的消息种类如下:(1)Windows2612.4Win32开发12.4.1抢先式多任务和多线程12.4.2连续的地址空间和先进的内存管理12.4.3内存映射文件12.4.4Win32s:Windows3.x对Win32API的支持12.4.5Win32编程基础返回首页12.4Win32开发12.4.1抢先式多任务和多线27Win32可以应用于特定的操作系统,这种系统可以直接控制和处理PC硬件资源,而不必象Win16API那样依赖于MS-DOS系统服务。然而,Win32不是简单的由Win16从16位到32位的升级,更重要的在于它支持:

(1)高性能的抢先式多任务和多线程;(2)连续的32位地址空间和先进的内存管理;(3)对所有的可为进程共享的对象,解决了它的安全性问题;(4)内存映射文件;

Win32可以应用于特定的操作系统,这种系统可以直接控制和处2812.4.1抢先式多任务和多线程Windows是一个多任务操作系统,它提供了一次运行多个应用程序的能力。

Windows3.x的多任务是一种由协作、软件方式产生的有限的非抢先式的多任务。

Windows95的多任务是一种抢先式多任务。在抢先式多任务操作系统中,系统在运行的所有进程之间对CPU时间进行共享,从而保证每个进程都能频繁的访问处理器,并且实现指令的连续执行。这样,每个Win32进程都需要分配一个优先级,系统调度程序利用这种优先级来决定哪一时刻。12.4.1抢先式多任务和多线程Windows是一个多任29一个线程处于以下三种状态之一:正在执行,挂起,准备运行。在单处理器环境下(如Windows95),同一时刻只能运行一个线程。为了在Win32中支持多线程进程结构,Win32在原来Win16基础上增加了:(1)对进程以及线程创建、操纵的支持;(2)对一个进程内线程之间的同步和同步对象的支持;(3)一个统一的共享机制。返回本节一个线程处于以下三种状态之一:正在执行,挂起,准备运行。在单3012.4.2连续的地址空间和先进的内存管理(1)申请一块可移动的内存块。

(2)锁定该内存块。因为Windows引入了虚拟内存管理,可以把内存块移动到硬盘交换文件中,所以在使用内存块之前,必须将它锁定在真正的内存RAM之中,也就是告诉操作系统,现在这块内存暂时由应用程序来管理。

(3)对该内存块进行各种操作:如复制数据到内存块。

(4)解锁内存,应用程序将对该内存的控制交予Windows。

12.4.2连续的地址空间和先进的内存管理(1)申请一块31下面给出一个程序片段,来说明内存管理函数的用法。HGLOBALmemHandle;//内存句柄charfar*lpMem;//假设长度为memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申请内存块,此处未做返回结果检查,//事实上,申请内存有时会失败memcpy(lpMem,string,textLen);//拷贝数据,其中string为一字符串变量,textLen

//是这个字符串的长度GlobalUnlock(memHandle);//解锁内存...GlobalFree((HGLOBAL)memHandle);//释放内存返回本节下面给出一个程序片段,来说明内存管理函数的用法。返回本节3212.4.3内存映射文件内存映射文件是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping)。这样,文件内的数据就可以用内存读/写指令来访问,而不是用ReadFile和WriteFile这样的I/O系统函数,从而提高了文件存取速度。这种函数最适用于需要读取文件并且对文件内包含的信息做语法分析的应用程序,如对输入文件进行语法分析的彩色语法编辑器,编译器等。

返回本节12.4.3内存映射文件内存映射文件是由一个文件到一块内3312.4.4Win32s:Windows3.x对Win32API的支持Win32s与Win32是有区别的。Win32s的s的含义是指子集(subset)。

运行在Windows3.x/Win32s系统上的Win32程序支持32位指针和32位寄存器,只需要在系统调用之前稍作形式替换。

Win32s子集同Win32相比,不支持多线程,高级图形API,异步文件I/O,Unicode和安全性;而且它是运行于16位的Windows系统上的。但是同Win16相比,有它的优越之处,目前在16位Windows程序开发方面有相当的潜力。

返回本节12.4.4Win32s:Windows3.x对Win3412.4.5Win32编程基础Win32数据类型这里的数据类型指的是一些关键字,这些关键字定义了Win32中的函数中的有关参数和返回值的大小和意义。这里需要解释一下的是句柄。句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个惟一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷和电话线路等。由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。

Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件和图标等系统资源。12.4.5Win32编程基础Win32数据类型35Win32常用的数据类型有:

返回本节Win32常用的数据类型有:返回本节3612.5MFC编程12.5.1MFC类库概念和组成12.5.2MFC应用程序框架12.5.3MFC的优点12.5.4MFC对消息的管理返回首页12.5MFC编程12.5.1MFC类库概念和组成返3712.5.1MFC类库概念和组成类库是一个可以在应用中使用的相互关联的C++类的集合。

Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的WindowsAPI。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。12.5.1MFC类库概念和组成类库是一个可以在应用中使38MFC可分为两个主要部分:

①基础类;②宏和全程函数。

MFC可分为两个主要部分:①基础类;39①基础类;MFC中的类按功能来分可划分为以下几类:基类、应用程序框架类、应用程序类、命令相关类、文档/视图类、线程类、可视对象类、窗口类、视图类、对话框类、属性表

、控制类、菜单类、设备描述表、绘画对象类、通用类、文件、诊断、异常、收集、模板收集、其他支持类、OLE2类、OLE基类、OLE可视编辑包装程序类、OLE可视编辑服务器程序类、OLE数据传输类、OLE对话框类、其他OLE类和数据库类。①基础类;MFC中的类按功能来分可划分为以下几类:40②宏和全程函数。

Microsoft基本宏和全程函数提供以下功能:数据类型、运行时刻对象类型服务、诊断服务、异常处理、CString格式化及信息框显示、消息映射、应用消息和管理、对象连接和嵌入(OLE)服务、标准命令和WindowsIDs。约定:全程函数以“Afx”为前缀,所有全程变量都是以“Afx”为前缀,宏不带任何特别前缀,但是全部大写。②宏和全程函数。Microsoft基本宏和全程函数提供以下41例12-1:CObject类的定义。

//classCObjectistherootofallcompliantobjectsclassCObject{public://Objectmodel(types,destruction,allocation)virtualCRuntimeClass*GetRuntimeClass()const;virtual~CObject();//virtualdestructorsarenecessary//Diagnosticallocationsvoid*PASCALoperatornew(size_tnSize);void*PASCALoperatornew(size_t,void*p);voidPASCALoperatordelete(void*p);#ifdefined(_DEBUG)&&!defined(_AFX_NO_DEBUG_CRT)//forfilename/linenumbertrackingusingDEBUG_NEWvoid*PASCALoperatornew(size_tnSize,LPCSTRlpszFileName,intnLine);#endif例12-1:CObject类的定义。42//Disablethecopyconstructorandassignmentbydefaultsoyouwillget//compilererrorsinsteadofunexpectedbehaviourifyoupassobjects//tected:CObject();private:CObject(constCObject&objectSrc);//noimplementationvoidoperator=(constCObject&objectSrc);//noimplementation//Attributes//Disablethecopyconstructo43public:BOOLIsSerializable()const;BOOLIsKindOf(constCRuntimeClass*pClass)const;//OverridablesvirtualvoidSerialize(CArchive&ar);//DiagnosticSupportvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;//Implementationpublic:staticconstAFX_DATACRuntimeClassclassCObject;#ifdef_AFXDLLstaticCRuntimeClass*PASCAL_GetBaseClass();#endif};public:44CObject类为派生类提供了下述服务:

(1)对象诊断。(2)运行时访问类的信息。

(3)对象持续性。

CObject类为派生类提供了下述服务:(1)对象诊断。45下面举个具体的例子来说明MFC所提供的应用程序框架,程序如例12-2所示。例12-2:应用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面举个具体的例子来说明MFC所提供的应用程序框架,程序如例46public:CMainWindow();DECLARE_MESSAGE_MAP()};BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)END_MESSAGE_MAP()/*CMinMFCAppMemberFunctions*/BOOLCMinMFCApp::InitInstance(){m_pMainWnd=newCMainWindow();m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();returnTRUE;}public:47/*CMainWindowmemberfunctions*/CMainWindow::CMainWindow()//constructor{Create(NULL,"MinMFCApplication",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);}/*aninstanceoftypeCMinMFCApp*/CMinMFCAppThisApp;返回本节/*CMainWindowmemberfunctions4812.5.2MFC应用程序框架MFCAppWizard生成的应用程序包含以下要素。

(1)WinMain()函数。Windows要求应用程序必须有一个WinMain()函数。

(2)应用程序类CMyFirstApp。该类的每一个对象代表一个应用程序。

(3)应用程序启动。

(4)成员函数CMyFirstApp::InitInstance()。

(5)成员函数CWinApp::Run()。

(6)CMainFrame类。

(7)文档与视图类。

(8)关闭应用程序。

返回本节12.5.2MFC应用程序框架MFCAppWizard4912.5.3MFC的优点MicrosoftMFC具有以下不同于其他类库的优势:完全支持Windows所有的函数、控件、消息、GDI基本图形函数、菜单及对话框。使用与传统的WindowsAPI同样的命名规则,即匈牙利命名法。进行消息处理时,不使用易产生错误的switch/case语句,所有消息映射到类的成员函数,这种直接消息到方法的映射对所有的消息都适用。

返回本节12.5.3MFC的优点MicrosoftMFC具有以5012.5.4MFC对消息的管理1.MFC对消息的处理2.消息的发送12.5.4MFC对消息的管理1.MFC对消息的处理511.MFC对消息的处理MFC不使用用C语言编写Windows程序时用的易产生错误的switch/case语句,而采用一种消息映射机制来决定如何处理特定的消息。这种消息映射机制包括一组宏,用于标识消息处理函数、映射类成员函数和对应的消息等。

1.MFC对消息的处理MFC不使用用C语言编写Windows52例12-3:消息处理函数例子。

classCMainFrame:CFrameWnd{public:CMainFrame();protected://{{AFX_MSG(CMainFrame)afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnEditCopy();afx_msgvoidOnClose();//}}AFX_MSGDECLARE_MESSAGE_MAP()};例12-3:消息处理函数例子。53例12-4:使用用户自定义消息。

#include<afxwin.h>#defineCM_APPLE(WM_USER+0)#defineCM_ORANGE(WM_USER+1)classCMainFrame:CFrameWnd{public:CMainFrame();protected:afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);afx_msgvoidOnClose();//handleuserselectappleafx_msgLRESULTCMApple(WPARAMwParam,LPARAMlParam);//handleuserselectorangeafx_msgLRESULTCMOrange(WPARAMwParam,LPARAMlParam);DECLARE_MESSAGE_MAP()};例12-4:使用用户自定义消息。54相应的消息映射如下:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_MESSAGE(CM_APPLE,CMApple)ON_MESSAGE(CM_ORANGE,CMOrange)ON_WM_CLOSE()END_MESSAGE_MAP()相应的消息映射如下:552.消息的发送Windows应用程序允许应用程序向自己发送消息、向其他应用程序发送消息,甚至可以向Windows操作系统本身发送消息(比如要求关闭操作系统或重新启动操作系统)。Windows提供了三个API函数用于发送消息,这三个函数是:SendMessage()、PostMessage()和SendDlgItemMessage()。2.消息的发送Windows应用程序允许应用程序向自己发送消56SendMessage()用于向窗口发送消息,该函数说明如下:

LRESULTSendMessage(HWNDhWnd, //消息要发往的窗口的句柄UINTMsg, //要发送的消息WPARAMwParam, //消息的第一个参数LPARAMlParam //消息的第二个参数);SendMessage()用于向窗口发送消息,该函数说明如下57PostMessage()函数说明如下:BOOLPostMessage(HWNDhWnd,//消息发往的窗口UINTMsg,//要发送的消息WPARAMwParam,//消息的第一个参数LPARAMlParam//消息的第二个参数);PostMessage()函数说明如下:BOOLPostM58SendDlgItemMessage()函数用于向对话框的某个控制发送消息,函数声明如下:

LONGSendDlgItemMessage(HWNDhDlg,//对话框句柄intnIDDlgItem,//对话框控件的IDUINTMsg,//要发送的消息WPARAMwParam,//消息的第一个参数LPARAMlParam//消息的第二个参数);返回本节SendDlgItemMessage()函数用于向对话框的某59演讲完毕,谢谢观看!演讲完毕,谢谢观看!60第12章

VisualC++环境下Windows程序开发概述12.1VisualC++可视化集成开发环境12.2创建、组织文件、工程和工作区12.3Windows编程基础12.4Win32开发12.5MFC编程第12章VisualC++环境下Windows程序开发6112.1VisualC++可视化集成开发环境12.1.1VisualC++简介12.1.2项目开发过程12.1.3集成开发环境DeveloperStudio12.1.4常用功能键及其意义返回首页12.1VisualC++可视化集成开发环境12.1.6212.1.1VisualC++简介1.VisualC++集成开发环境(IDE)集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。

2.向导(Wizard)向导是一个通过一步步的帮助引导你工作的工具。DeveloperStudio中包含三个向导。

3.MFC库库(library)是可以重复使用的源代码和目标代码的集合。MFC(MicrosoftFundamentalClasses)是VisualC++开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。

返回本节12.1.1VisualC++简介1.VisualC6312.1.2项目开发过程一个用C++开发项目的通用开发过程如图12-1所示。12.1.2项目开发过程一个用C++开发项目的通用开发过64建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。返回本节建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件6512.1.3集成开发环境DeveloperStudio1.进入DeveloperStudio2.DeveloperStudio的界面3.获得帮助信息4.VisualC++的编辑器12.1.3集成开发环境DeveloperStudio66图12-2DeveloperStudio界面图12-2DeveloperStudio界面67DeveloperStudio它具有以下特点:

(1)自动语法。

(2)自动缩进。

(3)参数帮助。

(4)集成的关键字帮助。

(5)拖放编辑。

(6)自动错误定位。

返回本节DeveloperStudio它具有以下特点:(1)自动6812.1.4常用功能键及其意义表12-1常用功能键12.1.4常用功能键及其意义表12-1常用功能键69返回本节返回本节7012.2创建、组织文件、工程和工作区12.2.1新建工程12.2.2新建工作区12.2.3增加已有文件到工程中12.2.4打开工作区12.2.5设置当前工程返回首页12.2创建、组织文件、工程和工作区12.2.1新建7112.2.1新建工程项目工作区是一个包含用户的所有相关项目和配置的实体。工程定义为一个配置和一组文件,用以生成最终的程序或二进制文件。一个项目工作区可以包含多个工程,这些工程既可以是同一类型的工程,也可以是不同类型的工程(如VisualC++和VisualJ++工程)。工作区现在以.dsw为后缀名(以前为.mdp),项目文件现在以.dsp(以前为.mak)为后缀名。项目工作区如图12-3所示。12.2.1新建工程项目工作区是一个包含用户的所有相关项72图12-3项目工作区图12-3项目工作区73要新建一个工程,可以:(1)在File菜单上,单击New,选择Projects标签。(2)从列表中选择项目类型(3)单击CreateNewWorkspace(新建工作区)或AddtoCurrentWorkspace(加入到当前工作区中)。(4)要使新工程为子工程,可以选择Dependencyof检查框,并从列表中选择一个工程。要新建一个工程,可以:74(5)在ProjectName框中,输入新工程名,确保该名字必须与工作区中的别的工程名字不重名。(6)在Location框中,指定工程存放的目录:可以直接输入路径名,也可以单击旁边的Browse按钮,浏览选择一个路径。(7)单击Platform框中的相应检查框,指定工程的开发平台返回本节(5)在ProjectName框中,输入新工程名,确保该名7512.2.2新建工作区要创建一个空的工作区,可以:

(1)在File菜单上,单击New。(2)在随后弹出的对话框上,单击Workspace标签。(3)从类型列表中选择BlankWorkspace。(4)在WorkspaceName框中输入名字,注意名字不能与它将要包含的工程同名。(5)在Location框中指定存放工作区文件的目录。(6)单击OK。返回本节12.2.2新建工作区要创建一个空的工作区,可以:返回7612.2.3增加已有文件到工程中(1)打开包含目标工程的项目工作区文件。(2)在Project菜单上,单击AddtoProject,然后单击Files。(3)在InsertFilesintoProject对话框中,浏览并定位要加入到工程中的文件名,然后选择它们。(4)从InsertInto中选择工程名字,然后单击OK。返回本节12.2.3增加已有文件到工程中(1)打开包含目标工程的7712.2.4打开工作区选择File-OpenWorkspace,指定要打开的工作区;或选择File-RecentWorkspaces,从最近打开过的工作区列表中选择一个。返回本节12.2.4打开工作区选择File-OpenWorks7812.2.5设置当前工程选择ProjectSetting,可以为当前工程设置编译、链接和C/C++等各种选项。

返回本节12.2.5设置当前工程选择ProjectSettin7912.3Windows编程基础12.3.1WindowsAPI12.3.2Windows基础12.3.3Windows消息映射和处理返回首页12.3Windows编程基础12.3.1Windo8012.3.1WindowsAPI1.WindowsAPI的定义WindowsAPI是应用程序编程接口(ApplicationProgrammingInterface)的英文缩写。它是大量函数加上数字常量、宏、结构、类型以及其他相关项的集合。2.WindowsAPI函数的分类根据WindowsAPI函数的功能,可以将其分为三类:(1)窗口管理函数。用以实现窗口的创建、移动和修改功能。(2)图形设备(GUI)函数。用以实现与设备无关的图形操作功能。(3)系统服务函数。用以实现与操作系统有关的多种功能。返回本节12.3.1WindowsAPI1.WindowsA8112.3.2Windows基础1.事件

事件以如下三种方式产生:(1)通过输入设备,如键盘和鼠标。(2)通过屏幕上的可视对象,如菜单、工具栏按钮、滚动条和对话框上的控件。(3)来自Windows内部。2.消息但Windows捕获一个事件后,它会编写一条消息,并将相关信息放入一个数据结构中,然后将包含此数据结构的消息发送给需要此消息的程序。Windows消息是在Windows文件中用宏定义的常数。消息常数名通常以WM开头,格式为WM_XXX。12.3.2Windows基础1.事件823.绘图及设备环境Windows具有图形用户界面(GUI),它包括菜单、工具栏、滚动条和对话框中的按钮等元素。4.对象与句柄对设备环境的访问是通过Windows返回的句柄进行的。

5.坐标系要为绘制和其他任务指定位置,需要坐标系统。Windows提供了8种不同的坐标系。

返回本节3.绘图及设备环境返回本节8312.3.3Windows消息映射和处理开始执行在Windows中,管理消息的方式通常是这样的:当发生某个消息后,该消息进入消息队列,操作系统根据消息提供的信息决定由哪个应用程序来处理,该应用程序依照一定的方式查找应用程序各个类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对应关系),找到处理程序,然后由处理程序执行。图12-4是Windows程序和Windows消息的基本流程。12.3.3Windows消息映射和处理开始执行84图12-4Windows程序和Windows消息处理的基本流程图12-4Windows程序和Windows消息处理的基85Windows程序要处理的消息种类如下:(1)Windows消息。该类消息以WM_开头(WM_COMMAND例外),通常由窗口和视图来处理。

(2)由控件和其他子窗口发送给父窗口的WM_COMMAND消息。这些消息中包括EN_CHANGE通知码。(3)来自于用户界面对象的WM_COMMAND消息。这些用户界面对象包括菜单、工具栏按钮和快捷键。返回本节Windows程序要处理的消息种类如下:(1)Windows8612.4Win32开发12.4.1抢先式多任务和多线程12.4.2连续的地址空间和先进的内存管理12.4.3内存映射文件12.4.4Win32s:Windows3.x对Win32API的支持12.4.5Win32编程基础返回首页12.4Win32开发12.4.1抢先式多任务和多线87Win32可以应用于特定的操作系统,这种系统可以直接控制和处理PC硬件资源,而不必象Win16API那样依赖于MS-DOS系统服务。然而,Win32不是简单的由Win16从16位到32位的升级,更重要的在于它支持:

(1)高性能的抢先式多任务和多线程;(2)连续的32位地址空间和先进的内存管理;(3)对所有的可为进程共享的对象,解决了它的安全性问题;(4)内存映射文件;

Win32可以应用于特定的操作系统,这种系统可以直接控制和处8812.4.1抢先式多任务和多线程Windows是一个多任务操作系统,它提供了一次运行多个应用程序的能力。

Windows3.x的多任务是一种由协作、软件方式产生的有限的非抢先式的多任务。

Windows95的多任务是一种抢先式多任务。在抢先式多任务操作系统中,系统在运行的所有进程之间对CPU时间进行共享,从而保证每个进程都能频繁的访问处理器,并且实现指令的连续执行。这样,每个Win32进程都需要分配一个优先级,系统调度程序利用这种优先级来决定哪一时刻。12.4.1抢先式多任务和多线程Windows是一个多任89一个线程处于以下三种状态之一:正在执行,挂起,准备运行。在单处理器环境下(如Windows95),同一时刻只能运行一个线程。为了在Win32中支持多线程进程结构,Win32在原来Win16基础上增加了:(1)对进程以及线程创建、操纵的支持;(2)对一个进程内线程之间的同步和同步对象的支持;(3)一个统一的共享机制。返回本节一个线程处于以下三种状态之一:正在执行,挂起,准备运行。在单9012.4.2连续的地址空间和先进的内存管理(1)申请一块可移动的内存块。

(2)锁定该内存块。因为Windows引入了虚拟内存管理,可以把内存块移动到硬盘交换文件中,所以在使用内存块之前,必须将它锁定在真正的内存RAM之中,也就是告诉操作系统,现在这块内存暂时由应用程序来管理。

(3)对该内存块进行各种操作:如复制数据到内存块。

(4)解锁内存,应用程序将对该内存的控制交予Windows。

12.4.2连续的地址空间和先进的内存管理(1)申请一块91下面给出一个程序片段,来说明内存管理函数的用法。HGLOBALmemHandle;//内存句柄charfar*lpMem;//假设长度为memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申请内存块,此处未做返回结果检查,//事实上,申请内存有时会失败memcpy(lpMem,string,textLen);//拷贝数据,其中string为一字符串变量,textLen

//是这个字符串的长度GlobalUnlock(memHandle);//解锁内存...GlobalFree((HGLOBAL)memHandle);//释放内存返回本节下面给出一个程序片段,来说明内存管理函数的用法。返回本节9212.4.3内存映射文件内存映射文件是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping)。这样,文件内的数据就可以用内存读/写指令来访问,而不是用ReadFile和WriteFile这样的I/O系统函数,从而提高了文件存取速度。这种函数最适用于需要读取文件并且对文件内包含的信息做语法分析的应用程序,如对输入文件进行语法分析的彩色语法编辑器,编译器等。

返回本节12.4.3内存映射文件内存映射文件是由一个文件到一块内9312.4.4Win32s:Windows3.x对Win32API的支持Win32s与Win32是有区别的。Win32s的s的含义是指子集(subset)。

运行在Windows3.x/Win32s系统上的Win32程序支持32位指针和32位寄存器,只需要在系统调用之前稍作形式替换。

Win32s子集同Win32相比,不支持多线程,高级图形API,异步文件I/O,Unicode和安全性;而且它是运行于16位的Windows系统上的。但是同Win16相比,有它的优越之处,目前在16位Windows程序开发方面有相当的潜力。

返回本节12.4.4Win32s:Windows3.x对Win9412.4.5Win32编程基础Win32数据类型这里的数据类型指的是一些关键字,这些关键字定义了Win32中的函数中的有关参数和返回值的大小和意义。这里需要解释一下的是句柄。句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个惟一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷和电话线路等。由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。

Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件和图标等系统资源。12.4.5Win32编程基础Win32数据类型95Win32常用的数据类型有:

返回本节Win32常用的数据类型有:返回本节9612.5MFC编程12.5.1MFC类库概念和组成12.5.2MFC应用程序框架12.5.3MFC的优点12.5.4MFC对消息的管理返回首页12.5MFC编程12.5.1MFC类库概念和组成返9712.5.1MFC类库概念和组成类库是一个可以在应用中使用的相互关联的C++类的集合。

Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的WindowsAPI。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。12.5.1MFC类库概念和组成类库是一个可以在应用中使98MFC可分为两个主要部分:

①基础类;②宏和全程函数。

MFC可分为两个主要部分:①基础类;99①基础类;MFC中的类按功能来分可划分为以下几类:基类、应用程序框架类、应用程序类、命令相关类、文档/视图类、线程类、可视对象类、窗口类、视图类、对话框类、属性表

、控制类、菜单类、设备描述表、绘画对象类、通用类、文件、诊断、异常、收集、模板收集、其他支持类、OLE2类、OLE基类、OLE可视编辑包装程序类、OLE可视编辑服务器程序类、OLE数据传输类、OLE对话框类、其他OLE类和数据库类。①基础类;MFC中的类按功能来分可划分为以下几类:100②宏和全程函数。

Microsoft基本宏和全程函数提供以下功能:数据类型、运行时刻对象类型服务、诊断服务、异常处理、CString格式化及信息框显示、消息映射、应用消息和管理、对象连接和嵌入(OLE)服务、标准命令和WindowsIDs。约定:全程函数以“Afx”为前缀,所有全程变量都是以“Afx”为前缀,宏不带任何特别前缀,但是全部大写。②宏和全程函数。Microsoft基本宏和全程函数提供以下101例12-1:CObject类的定义。

//classCObjectistherootofallcompliantobjectsclassCObject{public://Objectmodel(types,destruction,allocation)virtualCRuntimeClass*GetRuntimeClass()const;virtual~CObject();//virtualdestructorsarenecessary//Diagnosticallocationsvoid*PASCALoperatornew(size_tnSize);void*PASCALoperatornew(size_t,void*p);voidPASCALoperatordelete(void*p);#ifdefined(_DEBUG)&&!defined(_AFX_NO_DEBUG_CRT)//forfilename/linenumbertrackingusingDEBUG_NEWvoid*PASCALoperatornew(size_tnSize,LPCSTRlpszFileName,intnLine);#endif例12-1:CObject类的定义。102//Disablethecopyconstructorandassignmentbydefaultsoyouwillget//compilererrorsinsteadofunexpectedbehaviourifyoupassobjects//tected:CObject();private:CObject(constCObject&objectSrc);//noimplementationvoidoperator=(constCObject&objectSrc);//noimplementation//Attributes//Disablethecopyconstructo103public:BOOLIsSerializable()const;BOOLIsKindOf(constCRuntimeClass*pClass)const;//OverridablesvirtualvoidSerialize(CArchive&ar);//DiagnosticSupportvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;//Implementationpublic:staticconstAFX_DATACRuntimeClassclassCObject;#ifdef_AFXDLLstaticCRuntimeClass*PASCAL_GetBaseClass();#endif};public:104CObject类为派生类提供了下述服务:

(1)对象诊断。(2)运行时访问类的信息。

(3)对象持续性。

CObject类为派生类提供了下述服务:(1)对象诊断。105下面举个具体的例子来说明MFC所提供的应用程序框架,程序如例12-2所示。例12-2:应用程序框架示例。

#include<afxwin.h>//derivedanapplicationclassclassCMinMFCApp:publicCWinApp{public:BOOLInitInstance();};//DerivethemainwindowclassclassCMainWindow:publicCFrameWnd{下面举个具体的例子来说明MFC所提供的应用程序框架,程序如例106public:CMainWindow();DECLARE_MESSAGE_MAP()};BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)END_MESSAGE_MAP()/*CMinMFCAppMemberFunctions*/BOOLCMinMFCApp::InitInstance(){m_pMainWnd=newCMainWindow();m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();returnTRUE;}public:107/*CMainWindowmemberfunctions*/CMainWindow::CMainWindow()//constructor{Create(NULL,"MinMFCApplication",WS_OVERLAPPEDWINDOW,rectDefault,NULL,NULL);}/*aninstanceoftypeCMinMFCApp*/CMinMFCAppThisApp;返回本节/*CMainWindow

温馨提示

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

评论

0/150

提交评论