《VC++第1章VC++编程基础.ppt》由会员分享,可在线阅读,更多相关《VC++第1章VC++编程基础.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第第1 1章章 Visual C+Visual C+编程基础编程基础 了了解解WindowsWindows编编程程基基础础:消消息息和和事事件件、资资源源管管理理、设设备备独独立立性性等等概概念念了解了解MFCMFC类类的基础知识的基础知识熟熟练练掌掌握握用用向向导导建建立立应应用用程程序序框框架架明确明确MFCMFC应用程序结构应用程序结构教学目标Visual C+Visual C+程序设计电子教案程序设计电子教案-王明福编王明福编 教学内容 1.1 1.1 WindowsWindows编编程概念程概念 1.2 1.2 MFCMFC基基础础 1.3 1.3 第一个第一个MFCMFC应应用程
2、序用程序 1.4 1.4 应应用程序分析用程序分析 1.1 1.1 WindowsWindows编程概念编程概念 返返 回回Windows程序设计是基于事件驱动,程序的运行是由事件的发生来控制的。消息驱动机制是Windows程序设计的精髓。1.1.1 1.1.1 事件与消息事件与消息 当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Windows系统已经发生了一个事件,以及事件的种类、发生的时间和发生的位置(如坐标值)。事件以如下三种方式产生:通过输入设备,如键盘和鼠标,产生硬件事件。通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件。来自Windows内部,例如,当一个后
3、面的窗口显示到前面来。Windows消息是在Windows.h文件中用宏定义的常数。消息常数名通常为WM_XXX,例如,WM_WUIT、WM_CHAR。例如:当用户单击鼠标左键时,将发送WM_LBUTTONDOWN消息,而双击则发送WM_LBUTTONDBLCLK消息。1.1.2 1.1.2 消息驱动消息驱动DOS程序是由一系列预先定义好的操作序列的组合,具有一定的开头、中间过程和结束,也就是程序直接控制程序事件和过程的顺序。它的基本模型如图1-1(a)所示。事件驱动的程序设计不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序。它在程序设计过程
4、中除了完成所需功能之外,更多地考虑了用户的各种输入,并根据需要设计相应的处理程序。程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。如图1-1(b)所示。1.1.3 1.1.3 消息响应函数消息响应函数 消息响应函数是用于处理特定消息的一些代码。例如,当用户点击某菜单项时,希望程序弹出一个口令对话框,那么,只要在相应的消息处理函数中编写弹出一个口令对话框的代码。1.1.4 1.1.4 资源管理资源管理 程序员设计任何应用程序均将涉及到诸如菜单、对话框、消息框以及按钮等标准格式数据。Windows将这些数据保存在资源文件中,程序员可通过编辑工
5、具编辑、修改这些资源文件,使其提供所需的菜单或按钮,并将其放入设计的程序之中。1.1.5 1.1.5 设备独立性设备独立性 设备独立性或称设备无关性。在编程时,程序员不必关心诸如打印机、鼠标、键盘、显示器、声卡、显示卡、CDROM等多种设备的类型及其驱动程序。Windows95/98/2000提供了图形设备接口之类的各种抽象接口,使得在程序中可以通过调用标准函数与硬件交互,这些函数通过设备环境的数据结构,由Windows操作系统将其映射到相应的物理设备,而程序员则无需了解其提供的操作设备的各种指令。返返 回回 1.2 MFC1.2 MFC基础基础 VC+已集成了MFC库,VC+资源编辑器、Ap
6、pWziard和ClassWizard明显降低了应用程序编码的时间。AppWziard为整个应用程序生成框架代码,同时ClassWizard为消息处理程序生成原型和函数体。1.2.1 MFC类库简介MFC(MicrosoftFoundationClass)类库是用来编写Windows应用程序的C+类集,封装了大部分WindowsAPI函数,所以使用MFC类库和VC+提供的高度可视化的应用程序开发工具,使开发变得简单。MFC类库包括CObject类及其派生类以及其他类。有这样一些重要的类(都是CObject的派生类):应应用用程程序序类类CWinApp。CWndCWnd类类及及派派生生类类。CD
7、ocumentCDocument及及其其派派生生类类。File File ServicesServices。Graphical Graphical DrawingDrawing。Graphical Graphical Drawing Drawing ObjectsObjects。MenusMenus。ODBC Database和DAO Database Support。Internet ServicesInternet Services。等等。返返 回回1.2.2 1.2.2 MFCMFC应用程序框架应用程序框架在VC+6.0中,MFCAppWizard能方便地生成应用程序框架,然后在此基础上
8、进行进一步的编辑工作。MFCAppWizard生成的应用程序包括这样一些要素:WinMainWinMain函数。Windows要求应用程序必须有一个WinMain函数,它隐藏在应用程序框架中。应应用用程程序序类类。也称CMyHelloApp。该类的每一个对象代表一个应用程序。程序中默认定义一个全局CMyHelloApp对象,即theApp。应应用用程程序序启启动动。启动应用程序时,Windows调用应用程序框架内置的WinMain函数,WinMain寻找CWinApp由派生出的全局构造的应用程序对象。成成员员函函数数CMyHelloAppCMyHelloApp:InitInstanceInit
9、Instance。当WinMain函数找到应用程序对象时,它调用伪成员函数InitInstance,这个成员函数调用所需的构造并显示应用程序的主框架窗口。必须在派生的应用程序类中重载InitInstance,因为CWinApp基类不知道需要什么样的主框架窗口。成成员员函函数数CWinAppCWinApp:Run:Run。函数Run隐藏在基类中,但是它发送应用程序的消息到窗口,以保持应用程序的正常运行。在WinMain调用InitInstance之后,便调用Run。CMainFrameCMainFrame类类。类CMainFrame的对象代表应用程序的主框架窗口。当构造函数调用基类CFrameW
10、nd的成员函数Create时,Windows创建实际窗口结构,应用程序框架把它连接到C+对象,函数ShowWindows和UpdateWindow也是基类的成员函数,必须调用它们类显示窗口。文文档档与与视视图图类类。这一部分比较复杂,会在后面的章节中单独提出详细讲解。关关闭闭应应用用程程序序。如果用户通过关闭主框架窗口类关闭应用程序,这个操作就将激发一系列事件的发生,包括CMainFrame对象的析构、从Run中退出、从WinMain中退出和CMyHelloApp对象的折构。1.2.3 1.2.3 MFCMFC消息映射及处理消息映射及处理在MFC中,管理消息的方式是:当发生某一个消息(比如用户
11、移动了鼠标和按下键盘等)该消息进入消息队列,操作系统根据消息提供的信息决定由那个应用程序来处理,该应用程序依照一定的方式查找应用程序中各个类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对应关系)找到处理程序,然后由处理程序执行。MFC程序要处理消息的种类如下:Windows消息。以WM_开头,但WM_COMMAND例外。通常由窗口和视图来处理。由控件和其他子窗口发送给父窗口的WM_COMMAND消息。这些消息中包括EN_CHANGE通知码。如当用户在编辑框中键入文本或进行修改,就回向系统发送一个带EN_CHANGE通知码的WM_COMMAND消息。来自于用户界面对象的WM_CO
12、MMAND消息,如表1-1所示。这些用户界面对象包括菜单、工具栏按钮和快捷键。系统在处理这些用户界面对象的消息和前面有所不同,我们来看看标准的处理方式。返返 回回1.2.4 1.2.4 程序的运行过程程序的运行过程如图1-2所示,当运行用户应用程序时,程序中的框架首先获得控制权,然后依次执行下述功能:(1)做部分初始化工作。(2)构造应用程序的唯一应用类的对象,构造应用类对象时要调用其构造函数。(3)调用WinMain()函数(此函数也隐藏在应用框架内部)。(4)从WinMain()函数返回后,删除应用程序的唯一应用类的对象,删除时要调用其析构函数。(5)终止应用程序。(6)进行退出应用程序前
13、的收尾工作,如删除注册的窗口类并释放其内存等。(7)返回返返 回回 1.3 1.3 第一个第一个MFCMFC应用程序应用程序 用VC+编写MFC应用程序,是一种“填空式”的编程方法,一般有三个步骤:(1)创建工程:用VC+的MFCAppWizard生成应用程序的工程文件,即应用程序的基本框架。(2)可视化设计:用VC+自带的工具软件Winzards,制作Windows风格的图形用户界面和各种控件。(3)编写代码:用MFC ClassWizard添加消息响应函数,然后VC+提供的文本编辑器和C+程序设计语言在函数中编写代码。返返 回回1.3.1 MyHello应用程序应用程序 例程MyHello
14、.exe运行结果如下图所示。主窗口显示字符串:“Hello,我们开始Visual C+编程了!”。MyHello程序由以下两步完成:(1)用VC+6.0的MFC AppWizard,创建应用程序的基本窗口框架。(2)编写显示字符串:“Hello,我们开始Visual C+编程了!”的代码。(1)启动启动VC+,从从“File”菜单中选择菜单中选择“New”;(2)在在New对对话话框框中中选选择择“Project”标标签签,选选择择“MFC AppWizard(exe)”类型,告诉类型,告诉VC+即将创建一个即将创建一个EXE程序。程序。(3)在在“Project name”文文本本编编辑辑框
15、框中中输输入入“MyHelloMyHello”,单单击击位位于于“Location”框框右右边边的的小小按按钮钮,再再从从下下拉拉的的对对话话框框中中选选择择“D:MYVC”目录,使新创建的工程文件放置在目录,使新创建的工程文件放置在“D:MYVC”目录之下。目录之下。(分别指定了分别指定了MyHello.exe程序的工程类型、工程名字和工程位置程序的工程类型、工程名字和工程位置)1.3.2 1.3.2 创建工程创建工程(4)单击“OK”按钮。此时VisualC+将显示MFCAppWizard-Step1对话框。(5)在MFC AppWizard-Step 1对话框中:Single Docum
16、ent选项表示单文档界面,简称SDI,这种类型应用程的主窗口只能容纳一个文档,如Windows自带的记事本。Multiple documents选项表示多文档界面,简称MDI,这种类型应用程容许同时打开多个文档,这些文档可以层叠于主窗口。Microsoft Office产品就属于MDI应用程。Dialog based选项表示生成基于对话框的应用程序。在本例中选择“Single Document”,创建一个基于单文档界面的应用程序。然后选择资源语言。(6)单击“Finish”按钮,结束MFC AppWizard的设计工作,此时Vc+将显示New Project Information窗口,显示前
17、六步所做的选择的汇总信息。(7)单击“OK”。VC+就创建了MyHello工程以及相关的所有文件。1.3.3 1.3.3 编写程序代码编写程序代码 用VC+编写MFC应用程序,是一种“填空式”的编程方法,因为在利用MFC AppWizard生成框架程序,使得程序员免去了大量模式化工作,我们只要根据目标程序的要求,看哪些地方需要修改,再往里填写代码。在 Workspase窗 口 的 FileView标 签(工 程 资 源 管 理 器)中 选 择MyHelloView.cpp文件双击打开,然后找到函数OnDraw(CDC*pDC),在其中添加显示字符串:Hello,我们开始Visual C+编程了
18、!代码。void CMyHelloView:OnDraw(CDC*pDC)CMyHelloDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data here pDCpDC-TextOutTextOut(100,80,Hello,(100,80,Hello,我们开始我们开始Visual C+Visual C+编程了!编程了!););1.3.4 1.3.4 编译运行编译运行MyHelloMyHello应用程序应用程序编译、连接运行的操作步骤如下:(1)如下图所示,选择“Build”菜单中的“Build
19、 MyHello.exe”菜单项,VC+就会编译并连接成MyHello.exe程序。(2)选择“Build”菜单中的“Execute MyHello.exe”菜单项,VC+就会执行MyHello.exe程序,MyHello.exe程序主窗口也随之出现。1.4 1.4 应用程序分析应用程序分析 返返 回回 用用MFC MFC AppWizardAppWizard来来帮帮助助生生成成程程序序时时,MFCMFC类类做做了了很很多多工工作作,使使用户很容易地就能够编写一个程序。用户很容易地就能够编写一个程序。打打开开WorkspaceWorkspace窗窗口口中中的的ClassViewClassVie
20、w(类类视视图图)标标签签,我我们们看看到到MFCMFC生成了生成了5 5个类,如图个类,如图1-131-13所示。所示。CAboutDlgCAboutDlg CMainFrameCMainFrame CMyHelloAppCMyHelloApp CMyHelloDocCMyHelloDoc CMyHelloViewCMyHelloView 对对应应每每一一个个类类MFC MFC WizardWizard为为我我们们生生成成了了两两个个文文件件,分分别别以以.h h和和.cppcpp结结尾尾,在在.h h文文件件中中MFC MFC WizardWizard定定义义了了类类和和它它的的各各种种变
21、变量量、函函数,在数,在.cppcpp文件中来生成类对象,实现这个类。文件中来生成类对象,实现这个类。1.4.1 1.4.1 应用类应用类CMyHelloAppCMyHelloApp返返 回回 应用类CMyHelloApp派生于MFC中的CWinApp类 其其作用是初始化应用程序及运行该应用程序所需要的成员函数,而CWinApp类派生于CWinThread类,代表了程序中运行的主线程,它就是运行程序的本身,所以每一个基于MFC创建的应用程序只能包含该类唯一的派生类对象。MyHello.h是应用程序的主头文件,它声明了CMyHelloApp类,其中:虚函数InitInstance()的作用是:设
22、置注册数据库,载入标准设置(最近打开文件列表等)、注册文档模板并隐含地创建了主窗口、处理命令行参数和显示窗口,然后返回、进入消息循环。CMyHelloApp类的完整代码如下:classCMyHelloApp:publicCWinApppublic:CMyHelloApp();/Overrides/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CMyHelloApp)public:virtualBOOLInitInstance();/AFX_VIRTUAL/Implementation/AFX_MSG(CMyHelloApp)a
23、fx_msgvoidOnAppAbout();/NOTE-theClassWizardwilladdandremovememberfunctionshere./DONOTEDITwhatyouseeintheseblocksofgeneratedcode!/AFX_MSGDECLARE_MESSAGE_MAP();1.4.2 1.4.2 主框架窗口类主框架窗口类CMainFrameCMainFrame返返 回回窗口类CMainFrame派生于CFrameWnd主要用来管理应用程序的窗口,显示标题栏、工具栏、状态栏等。同时还要处理针对窗口操作的消息。在窗口类CMainFrame中有:两个主要函数
24、PreCreateWindow和OnCreate两个对象m_wndStatusBar(属于状态栏类CStatusBar,用于创建管理状态栏)和m_wndToolBar(属于工具栏类CToolBar,用于创建管理工具栏)。类CMainFrame在MainFrm.h中定义,完整的代码如下:class CMainFrame:public CFrameWndprotected:/create from serialization onlyCMainFrame();DECLARE_DYNCREATE(CMainFrame)/AFX_VIRTUAL(CMainFrame)virtual BOOL PreC
25、reateWindow(CREATESTRUCT&cs);/AFX_VIRTUAL protected:/control bar embedded membersCStatusBar m_wndStatusBar;CToolBar m_wndToolBar;protected:/AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see
26、 in these blocks of generated code!/AFX_MSGDECLARE_MESSAGE_MAP();1.4.3 1.4.3 文档类文档类CMyHelloDocCMyHelloDoc 返返 回回文档类CMyHelloDoc派生于CDocument类。主要用来存放应用程序的数据,以及文件的保存加载功能,文档类要通过与视图类来实现与用户的交互。在文档类CMyHelloDoc中:声明的OnNewDocument函数用于初始化文档,Serialize函数串行化(保存和装入)文档,Dump函数用于调试诊断。文档类类CMyHelloDoc的详细代码如下:classCMyHell
27、oDoc:publicCDocumentprotected:/createfromserializationonlyCMyHelloDoc();DECLARE_DYNCREATE(CMyHelloDoc)/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CMyHelloDoc)public:virtualBOOLOnNewDocument();virtualvoidSerialize(CArchive&ar);/AFX_VIRTUAL/Implementationpublic:virtualCMyHelloDoc();#ifde
28、f_DEBUGvirtualvoidAssertValid()const;virtualvoidDump(CDumpContext&dc)const;#endifDECLARE_MESSAGE_MAP();1.4.4 1.4.4 视图类视图类CMyHelloView CMyHelloView 返返 回回视图类CMyHelloView派生于CView类视图类用于管理视图窗口,它对应的对象在框架窗口中实现用户数据的显示和打印。在视图类CMyHelloView中有:与 文 档 数 据 相 关 的 三 个 函 数 OnPreparePrinting、OnBeginPrintting和OnEndPrin
29、ting,用以实现数据打印;声明了返回CMYhelloDoc指针的函数GetDocument用以获取文档的指针,以实现对用户文档的数据的操作;声明了函数OnDraw,用以实现视图数据的显示和刷新。视图类CMyHelloView的详细代码如下:classCMyHelloView:publicCViewprotected:/createfromserializationonlyCMyHelloView();DECLARE_DYNCREATE(CMyHelloView)public:CMyHelloDoc*GetDocument();/Operationspublic:/AFX_VIRTUAL(CM
30、yHelloView)public:virtualvoidOnDraw(CDC*pDC);/overriddentodrawthisviewvirtualBOOLPreCreateWindow(CREATESTRUCT&cs);protected:virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtualvoidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtualvoidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);/AFX_VIRTUALDECLARE_MESSAGE_MAP();返返 回回1 1WindowsWindows程序设计的特点是什么?程序设计的特点是什么?2 2WindowsWindows应用程序的优点是什么?应用程序的优点是什么?3.3.MFC MFC AppWizard(AppWizard(应应用用向向导导)可可以以创创建建哪哪几几类类应应用用程程序?各有何特点?序?各有何特点?4.4.请请用用MFC MFC AppWizardAppWizard创创建建一一个个基基于于对对话话框框的的应应用用程程序序,列列出出所所创创建建的的类类,并并与与MyHelloMyHello工工程程比比较较,观观察察他们的异同。他们的异同。习习 题题