1 / 27

第1章 Visual C++ 编程基础

第1章 Visual C++ 编程基础. 教学目标. 了解 Windows 编程基础:消息和事件、资源管理、 设备独立性 等概念 了解 MFC 类的基础知识 熟练掌握用向导建立应用程序框架 明确 MFC 应用程序结构. 《Visual C++ 程序设计》电子教案----王明福编. 教学内容. 1.1 Windows 编程概念 1.2 MFC 基础 1.3 第一个 MFC 应用程序 1.4 应用程序分析. 返 回. 1.1 Windows 编程概念.

gracie
Download Presentation

第1章 Visual C++ 编程基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第1章 Visual C++编程基础 教学目标 • 了解Windows编程基础:消息和事件、资源管理、设备独立性等概念 • 了解MFC类的基础知识 • 熟练掌握用向导建立应用程序框架 • 明确MFC应用程序结构 《Visual C++程序设计》电子教案----王明福编

  2. 教学内容 • 1.1 Windows编程概念 • 1.2 MFC基础 • 1.3 第一个MFC应用程序 • 1.4 应用程序分析

  3. 返 回 1.1 Windows编程概念 Windows程序设计是基于事件驱动,程序的运行是由事件的发生来控制的。消息驱动机制是Windows程序设计的精髓。 1.1.1 事件与消息 当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Windows系统已经发生了一个事件,以及事件的种类、发生的时间和发生的位置(如坐标值)。事件以如下三种方式产生: ● 通过输入设备,如键盘和鼠标,产生硬件事件。 ● 通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件。 ● 来自Windows内部,例如,当一个后面的窗口显示到前面来。 Windows消息是在Windows.h文件中用宏定义的常数。消息常数名通常为WM_XXX,例如,WM_WUIT、WM_CHAR。 例如:当用户单击鼠标左键时,将发送WM_LBUTTONDOWN消息,而双击则发送WM_LBUTTONDBLCLK消息。

  4. 1.1.2 消息驱动 DOS程序是由一系列预先定义好的操作序列的组合,具有一定的开头、中间过程和结束,也就是程序直接控制程序事件和过程的顺序。它的基本模型如图1-1(a)所示。 事件驱动的程序设计不是由事件的顺序来控制,而是由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序。 它在程序设计过程中除了完成所需功能之外,更多地考虑了用户的各种输入,并根据需要设计相应的处理程序。程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。如图1-1(b)所示。

  5. 返 回 1.1.3 消息响应函数 消息响应函数是用于处理特定消息的一些代码。例如,当用户点击某菜单项时,希望程序弹出一个口令对话框,那么,只要在相应的消息处理函数中编写弹出一个口令对话框的代码。 1.1.4 资源管理 程序员设计任何应用程序均将涉及到诸如菜单、对话框、消息框以及按钮等标准格式数据。Windows将这些数据保存在资源文件中,程序员可通过编辑工具编辑、修改这些资源文件,使其提供所需的菜单或按钮,并将其放入设计的程序之中。 1.1.5 设备独立性 设备独立性或称设备无关性。在编程时,程序员不必关心诸如打印机、鼠标、键盘、显示器、声卡、显示卡、CDROM等多种设备的类型及其驱动程序。Windows95/98/2000提供了图形设备接口之类的各种抽象接口,使得在程序中可以通过调用标准函数与硬件交互,这些函数通过设备环境的数据结构,由Windows操作系统将其映射到相应的物理设备,而程序员则无需了解其提供的操作设备的各种指令。

  6. 1.2 MFC基础 返 回 VC++已集成了MFC库,VC++资源编辑器、AppWziard和ClassWizard明显降低了应用程序编码的时间。AppWziard为整个应用程序生成框架代码,同时ClassWizard为消息处理程序生成原型和函数体。 1.2.1 MFC类库简介 MFC(Microsoft Foundation Class)类库是用来编写Windows应用程序的C++类集,封装了大部分Windows API函数,所以使用MFC类库和VC++提供的高度可视化的应用程序开发工具,使开发变得简单。 MFC类库包括CObject类及其派生类以及其他类。有这样一些重要的类(都是CObject的派生类): ● 应用程序类CWinApp。●CWnd类及派生类。● CDocument及其派生类。● File Services。● Graphical Drawing。● Graphical Drawing Objects。●Menus。● ODBC Database和DAO Database Support。● Internet Services。等等。

  7. 1.2.2 MFC应用程序框架 在VC++6.0中,MFC AppWizard能方便地生成应用程序框架,然后在此基础上进行进一步的编辑工作。MFC AppWizard生成的应用程序包括这样一些要素: ● WinMain函数。Windows要求应用程序必须有一个WinMain函数,它隐藏在应用程序框架中。 ● 应用程序类。也称CMyHelloApp。该类的每一个对象代表一个应用程序。程序中默认定义一个全局CMyHelloApp对象,即theApp。 ●应用程序启动。启动应用程序时,Windows调用应用程序框架内置的WinMain函数,WinMain寻找CWinApp由派生出的全局构造的应用程序对象。 ● 成员函数CMyHelloApp::InitInstance。当WinMain函数找到应用程序对象时,它调用伪成员函数InitInstance,这个成员函数调用所需的构造并显示应用程序的主框架窗口。必须在派生的应用程序类中重载InitInstance,因为CWinApp基类不知道需要什么样的主框架窗口。 ●成员函数CWinApp::Run。函数Run隐藏在基类中,但是它发送应用程序的消息到窗口,以保持应用程序的正常运行。在WinMain调用InitInstance之后,便调用Run。

  8. CMainFrame类。类CMainFrame的对象代表应用程序的主框架窗口。当构造函数调用基类CFrameWnd的成员函数Create时,Windows创建实际窗口结构,应用程序框架把它连接到C++对象,函数ShowWindows和UpdateWindow也是基类的成员函数,必须调用它们类显示窗口。 ● 文档与视图类。这一部分比较复杂,会在后面的章节中单独提出详细讲解。 ● 关闭应用程序。如果用户通过关闭主框架窗口类关闭应用程序,这个操作就将激发一系列事件的发生,包括CMainFrame对象的析构、从Run中退出、从WinMain中退出和CMyHelloApp对象的折构。

  9. 返 回 1.2.3 MFC消息映射及处理 在MFC中,管理消息的方式是:当发生某一个消息(比如用户移动了鼠标和按下键盘等)该消息进入消息队列,操作系统根据消息提供的信息决定由那个应用程序来处理,该应用程序依照一定的方式查找应用程序中各个类的消息映射(一组宏,这些宏用来确定某个消息及相应的处理程序的对应关系)找到处理程序,然后由处理程序执行。 MFC程序要处理消息的种类如下: ● Windows消息。以WM_开头,但WM_COMMAND例外。通常由窗口和视图来处理。 ● 由控件和其他子窗口发送给父窗口的WM_COMMAND消息。这些消息中包括EN_CHANGE通知码。如当用户在编辑框中键入文本或进行修改,就回向系统发送一个带EN_CHANGE通知码的WM_COMMAND消息。 ● 来自于用户界面对象的WM_COMMAND消息,如表1-1所示。这些用户界面对象包括菜单、工具栏按钮和快捷键。系统在处理这些用户界面对象的消息和前面有所不同,我们来看看标准的处理方式。

  10. 1.2.4 程序的运行过程 如图1-2所示,当运行用户应用程序时,程序中的框架首先获得控制权,然后依次执行下述功能: (1) 做部分初始化工作。 (2) 构造应用程序的唯一应用类的对象,构造应用类对象时要调用其构造函数。 (3) 调用WinMain()函数(此函数也隐藏在应用框架内部)。 (4) 从WinMain()函数返回后,删除应用程序的唯一应用类的对象,删除时要调用其析构函数。 (5) 终止应用程序。 (6) 进行退出应用程序前的收尾工作,如删除注册的窗口类并释放其内存等。 (7) 返回 返 回

  11. 1.3 第一个MFC应用程序 返 回 用VC++编写MFC应用程序,是一种“填空式”的编程方法,一般有三个步骤: (1) 创建工程:用V C++的MFC AppWizard生成应用程序的工程文件,即应用程序的基本框架。 (2)可视化设计:用VC++自带的工具软件Winzards,制作Windows风格的图形用户界面和各种控件。 (3)编写代码:用MFC ClassWizard添加消息响应函数,然后VC++提供的文本编辑器和C++程序设计语言在函数中编写代码。

  12. 1.3.1 MyHello应用程序 例程MyHello.exe运行结果如下图所示。主窗口显示字符串:“Hello,我们开始Visual C++编程了!”。 MyHello程序由以下两步完成: (1) 用VC++6.0的MFC AppWizard,创建应用程序的基本窗口框架。 (2) 编写显示字符串:“Hello,我们开始Visual C++编程了!”的代码。

  13. 1.3.2 创建工程 (1) 启动VC++,从“File”菜单中选择“New”; (2) 在New对话框中选择“Project”标签 ,选择“MFC AppWizard(exe)”类型,告诉VC++即将创建一个EXE程序。 (3) 在“Project name”文本编辑框中输入“MyHello”,单击位于“Location”框右边的小按钮,再从下拉的对话框中选择“D:\MYVC”目录,使新创建的工程文件放置在“D:\MYVC”目录之下。 (分别指定了MyHello.exe程序的工程类型、工程名字和工程位置)

  14. (4) 单击“OK”按钮。此时Visual C++将显示MFC AppWizard-Step 1对话框。 (5)在MFC AppWizard-Step 1对话框中: ● Single Document选项表示单文档界面,简称SDI,这种类型应用程的主窗口只能容纳一个文档,如Windows自带的记事本。 ●Multiple documents选项表示多文档界面,简称MDI,这种类型应用程容许同时打开多个文档,这些文档可以层叠于主窗口。Microsoft Office产品就属于MDI应用程。 ● Dialog based选项表示生成基于对话框的应用程序。 在本例中选择“Single Document”,创建一个基于单文档界面的应用程序。然后选择资源语言。

  15. (6) 单击“Finish”按钮,结束MFC AppWizard的设计工作,此时Vc++将显示New Project Information窗口,显示前六步所做的选择的汇总信息。 (7) 单击“OK”。VC++就创建了MyHello工程以及相关的所有文件。

  16. 1.3.3 编写程序代码 用VC++编写MFC应用程序,是一种“填空式”的编程方法,因为在利用MFC AppWizard生成框架程序,使得程序员免去了大量模式化工作,我们只要根据目标程序的要求,看哪些地方需要修改,再往里填写代码。 在Workspase窗口的FileView标签(工程资源管理器)中选择MyHelloView.cpp文件双击打开,然后找到函数OnDraw(CDC* pDC),在其中添加显示字符串:"Hello, 我们开始Visual C++编程了!"代码。 void CMyHelloView::OnDraw(CDC* pDC) { CMyHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(100,80,"Hello, 我们开始Visual C++编程了!"); }

  17. 1.3.4 编译运行MyHello应用程序 编译、连接运行的操作步骤如下: (1) 如下图所示,选择“Build”菜单中的“Build MyHello.exe”菜单项, VC++就会编译并连接成MyHello.exe程序。 (2) 选择“Build”菜单中的“Execute MyHello.exe”菜单项, VC++就会执行MyHello.exe程序,MyHello.exe程序主窗口也随之出现。

  18. 1.4 应用程序分析 返 回 用MFC AppWizard来帮助生成程序时,MFC类做了很多工作,使用户很容易地就能够编写一个程序。 打开Workspace窗口中的ClassView(类视图)标签,我们看到MFC生成了5个类,如图1-13所示。 ● CAboutDlg ● CMainFrame ● CMyHelloApp ● CMyHelloDoc ● CMyHelloView 对应每一个类MFC Wizard为我们生成了两个文件,分别以.h和.cpp结尾,在..h文件中MFC Wizard定义了类和它的各种变量、函数,在.cpp文件中来生成类对象,实现这个类。

  19. 1.4.1 应用类CMyHelloApp 返 回 • 应用类CMyHelloApp派生于MFC中的CWinApp类 • 其作用是初始化应用程序及运行该应用程序所需要的成员函数,而CWinApp类派生于CWinThread类,代表了程序中运行的主线程,它就是运行程序的本身,所以每一个基于MFC创建的应用程序只能包含该类唯一的派生类对象。 MyHello.h是应用程序的主头文件,它声明了CMyHelloApp类,其中: • 虚函数InitInstance()的作用是:设置注册数据库,载入标准设置(最近打开文件列表等)、注册文档模板并隐含地创建了主窗口、处理命令行参数和显示窗口,然后返回、进入消息循环。 CMyHelloApp类的完整代码如下:

  20. class CMyHelloApp : public CWinApp { public: CMyHelloApp(); // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyHelloApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CMyHelloApp) afx_msg void OnAppAbout(); // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() };

  21. 1.4. 2 主框架窗口类CMainFrame 返 回 •窗口类CMainFrame派生于CFrameWnd • 主要用来管理应用程序的窗口,显示标题栏、工具栏、状态栏等。同时还要处理针对窗口操作的消息。 在窗口类CMainFrame中有: • 两个主要函数PreCreateWindow和OnCreate • 两个对象m_wndStatusBar(属于状态栏类CStatusBar,用于创建管理状态栏)和m_wndToolBar(属于工具栏类CToolBar,用于创建管理工具栏)。 类CMainFrame在MainFrm.h中定义,完整的代码如下:

  22. class CMainFrame : public CFrameWnd { protected: // create from serialization only CMainFrame(); DECLARE_DYNCREATE(CMainFrame) …… //{{AFX_VIRTUAL(CMainFrame) virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL ……  protected: // control bar embedded members CStatusBar 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 in these blocks of generated code! //}}AFX_MSG DECLARE_MESSAGE_MAP() };

  23. 1.4.3 文档类CMyHelloDoc 返 回 • 文档类CMyHelloDoc派生于CDocument类。 • 主要用来存放应用程序的数据,以及文件的保存加载功能,文档类要通过与视图类来实现与用户的交互。 在文档类CMyHelloDoc中: • 声明的OnNewDocument函数用于初始化文档,Serialize函数串行化(保存和装入)文档,Dump函数用于调试诊断。 文档类类CMyHelloDoc的详细代码如下:

  24. class CMyHelloDoc : public CDocument { protected: // create from serialization only CMyHelloDoc(); DECLARE_DYNCREATE(CMyHelloDoc) ……  // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMyHelloDoc) public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); //}}AFX_VIRTUAL // Implementation public: virtual ~CMyHelloDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif  ……  DECLARE_MESSAGE_MAP() };

  25. 1.4.4 视图类CMyHelloView 返 回 • 视图类CMyHelloView派生于CView类 • 视图类用于管理视图窗口,它对应的对象在框架窗口中实现用户数据的显示和打印。 在视图类CMyHelloView中有: •与文档数据相关的三个函数OnPreparePrinting、OnBeginPrintting和OnEndPrinting,用以实现数据打印;声明了返回CMYhelloDoc指针的函数GetDocument用以获取文档的指针,以实现对用户文档的数据的操作;声明了函数OnDraw,用以实现视图数据的显示和刷新。 视图类CMyHelloView的详细代码如下:

  26. class CMyHelloView : public CView { protected: // create from serialization only CMyHelloView(); DECLARE_DYNCREATE(CMyHelloView)  public: CMyHelloDoc* GetDocument(); // Operations public:   //{{AFX_VIRTUAL(CMyHelloView) public: virtual void OnDraw(CDC* pDC); // overridden to draw this view virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); //}}AFX_VIRTUAL  …… DECLARE_MESSAGE_MAP() };

  27. 习 题 返 回 1.Windows程序设计的特点是什么? 2.Windows应用程序的优点是什么? 3. MFC AppWizard(应用向导)可以创建哪几类应用程序?各有何特点? 4. 请用MFC AppWizard创建一个基于对话框的应用程序,列出所创建的类,并与MyHello工程比较,观察他们的异同。

More Related