第2章 vc++ 应用程序框架和基本流程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第2章应用程序框架和基本流程2.1应用程序框架2.2应用程序的基本流程2.3应用程序框架类2.1应用程序框架所谓应用程序框架(applicationframework),就是应用程序所应具备的一般性软件模块按一定的结构组成的集合。基于MFC的应用程序框架是定义了程序结构的MFC类库中类的集合。运用MFC应用程序框架能获得标准化的程序结构和用户接口,极大地减轻程序员的负担,使程序员不必过多地考虑用户界面,而把主要精力放在程序设计上,以提高程序设计的效率。应用程序框架实际上是一个完整的程序模型,具备标准应用软件所需的一切基本功能,如文件存取、打印预览、数据交换,窗口排列,……,以及这些功能的使用接口(菜单、工具栏、状态栏、对话框等)。有了应用程序框架之后,程序员只要依个人需要在派生类中改写虚函数,定义新的数据成员,用资源编辑器增加或修改用户界面,进行消息映射,用MFC类实现框架中未完成的应用程序的特定功能部分。Sample程序2.1.1应用程序基本结构Windows应用程序都有一个窗口作为程序的输入/输出和用户操作界面,而内部的运行系依靠外部发生的事件来驱动。在程序启动、创建和显示窗口后,程序不断等待任何可能的输入,然后做判断,再做适当的处理。这里,“输入”是由操作系统通过USER模块捕捉到之后,以消息形式(一种数据结构)进入程序的消息队列之中。因此,为了不断地从消息队列中获取消息,转换消息,分配消息给适当的处理函数,每一个Windows程序都应该有一个消息循环。在Windows程序中,接受并处理消息的主角肯定是窗口。因此,每一个窗口都应该有一个函数负责处理消息,我们称此函数为“窗口函数”。窗口函数WindowProc以switch/case的方式判断消息的类别,决定处理的方式。另外,对于一个窗口,还必须有创建窗口的函数CreateWindow和显示窗口的函数ShowWindow。在DOS系统下,C/C++程序都有一个主函数main,控制程序的流程。同样,在Windows系统下,每一个由C/C++编写的Windows程序也有一个主函数AfxWinMain,控制Windows程序的流程。此外,每个Windows程序实例有一些初始化工作需要完成。因此,就应该定义一个初始化函数:InitInstance。纵上所述,一个Windows程序的基本结构至少包括:消息循环函数Run、窗口函数WindowProc、窗口创建函数CreateWindow、窗口显示函数ShowWindow、主函数AfxWinMain、程序初始化函数InitInstance。因此,在MFC类库中,应用程序类CWinApp封装了消息循环函数Run、程序初始化函数InitInstance和退出函数ExitInstance。基于上述情况,采用MFC类库开发的所有Windows程序都至少有一个从CWinApp派生的应用程序类和一个从CWnd派生的窗口类,而AfxWinMain函数则由系统提供,不能更改。窗口基类CWnd则封装了窗口函数WindowProc、窗口创建函数Create、窗口显示函数ShowWindow,并把窗口句柄HWND定义为数据成员,还定义了大量的Windows消息处理函数。2.1.2使用向导生成应用程序框架AppWizard可为使用MFC的典型Windows应用程序建立开发项目,提供了一系列的对话框,及多种选项供用户选择,用户可以根据不同的选项生成自己所需的具有各种特征的应用程序框架。AppWizard:参见教材P5~9(图2.1~图2.10。下面通过AppWizard来生成一个最简单的应用程序框架(Hello程序)。从AppWizardStep1可见,MFC生成的应用程序的用户界面只有三种类型:•单文档型:主边框窗口+视图+[文档]•多文档型:主边框窗口+子边框窗口+视图+[文档]•对话框型:对话框+控件我们也可以进一步把MFC应用程序的用户界面简化为二种类型,并简称为窗口型和对话框型:•窗口型:边框窗口+视图•对话框型:对话框+控件2.2.1创建全局对象2.2应用程序的基本流程应用程序类构成了应用程序的主执行线程。每个基于MFC类库而建立的应用程序都必须有一个且只有一个从CWinApp类派生的全局对象。以Hello程序为例,在应用程序类的实现文件HelloApp.cpp中定义:CHelloApptheApp;2.2.2AfxWinMain函数main函数是一般C/C++DOS型程序的进入点,而AfxWinMain函数则是Windows程序的进入点。但在VC中程序员不用编写AfxWinMain代码,它是由MFC类库提供的,在应用程序启动时自动调用这个函数。AfxWinMain函数(winmain.cpp)定义为:CWinThread*pThread=AfxGetThread();AfxWinInit(…);//图形用户界面初始化pThread-InitApplication();//程序初始化pThread-InitInstance();//程序实例初始化pThread-Run();//消息循环(程序运行)AfxWinTerm();//程序终止InitApplication函数一般没有实质性的内容,程序的初始化主要通过InitInstance函数完成。InitInstance函数主要完成窗口的创建、显示和更新等重要的初始化工作,是CWinApp派生类中必须改写的成员(虚)函数。2.2.3应用程序的初始化BOOLCHelloApp::InitInstance(){m_pMainwnd=newCHelloFrame();m_pMainwnd-ShowWindow(m_nCmdShow);m_pMainwnd-UpdateWindow();}现在,执行的脚步到达pThread-Run(),即调用CWinThread的Run函数。Run函数主要是调用全局函数PeekMessage来检查消息队列,若有消息则调用成员函数PumpMessage泵送消息,分配消息给适当的处理函数进行处理。2.2.4消息循环theApp//创建全局的应用程序对象AfxWinMain//入口函数AfxWinInit//GUI初始化InitInstance//初始化应用程序实例Create()、ShowWindow()、UpdateWindow()//创建窗口、显示窗口、更新窗口Run()//消息循环,创建视图对象并显示Hello!AfxWinTerm//结束程序2.2.5程序的启动、运行和退出2.3应用程序框架类及其主要成员函数应用程序框架构成:•应用程序类+•边框窗口类和视图类或对话框类和控件类2.3.1应用程序类每个应用程序都从类CWinApp派生出自己的应用程序类,并定义一个全局对象theApp。该应用程序类包含了Windows下MFC应用程序的初始化、运行和结束过程。CWinApp类在MFC体系中的层次如下图所示。CObjectCCmdTargetCWinTreadCWinAppCWinApp的主要数据成员:m_pszAppName:指定了应用程序名称m_pMainWnd:指向主边框窗口的指针m_lpCmdLine:指示一个以NULL结尾的字符串,指向应用程序的命令行m_nCmdShow:指示最初如何显示窗口CWinApp的主要成员函数:InitInstance()函数用于初始化实例Run()函数用于处理消息循环ExitInstance()函数使应用程序退出OnIdle()函数用于空闲处理2.3.2边框窗口类和视图类1.主边框窗口类每个窗口型的应用程序都有一个且只有一个主边框窗口类CMainFrame。对于单文档,它是从CFrameWnd类派生;对于多文档,它是从CMDIFrameWnd类派生。主边框窗口在屏幕上生成一个带边框的大小可调的桌面窗口,内含一个大的空白工作区域称为视图,它专门负责程序文档数据的屏幕显示和用户对文档的操作。主边框窗口一般还含有菜单栏、工具栏和状态栏。2.子边框窗口类对于多文档的窗口型应用程序,在主边框窗口内还有一个或多个子边框窗口,它由CChildFrame管理,是从CMDIChildWnd类派生。子边框窗口只能位于主边框窗口内,子边框窗口内部完全被视图占据,它不能有自己的菜单栏、工具栏和状态栏。多个子边框窗口与一个主边框窗口共享一套菜单和工具栏。菜单和工具栏显示的内容与当前活动的子边框窗口有关。视图由视图类管理,有二种视图类:•无文档/视图结构支持的应用程序,视图类是直接从CWnd类派生•有文档/视图结构支持的应用程序,视图类是从CView或其派生类派生。3.视图视图是边框窗口内的大片空白区域,称为客户区或工作区,负责在屏幕上显示程序的数据,并接受用户的操作。边框窗口类和视图类在MFC体系中的层次如下图所示。CObjectCCmdTargetCWndCFrameWndCMDIFrameWndCMDIChildWndCViewCCtrlViewCScrollView4.边框窗口类的主要成员函数Create、LoadFrame用于创建边框窗口PreCreateWindow用于定制边框窗口ShowWindow、UpdateWindow、DestroyWindow用于显示、更新、销毁边框窗口GetActiveView、GetActiveDocument用于获得当前活动的视图和文档EnableDocking、DockControlBar用于允许工具栏停靠和确定具体的停靠位置MDITile、MDICascade用于平铺、层叠所有子窗口MDIGetActive获得当前活动的子边框窗口OnPaint用于重绘屏幕5.视图类的主要成员函数视图类用于程序的输入和输出,其主要成员函数都来自窗口基类CWnd,输入方面主要是改写鼠标消息处理函数,输出方面主要是改写OnPaint函数,以实现屏幕的数据显示和屏幕重绘。但在有文档/视图结构的程序中,OnPaint函数已被改写好,它调用OnDraw函数,因此代以OnDraw函数负责文档的数据显示和屏幕重绘。此处改动的目的是为了便于实现“所见即所得”,即打印函数OnPrint也将调用OnDraw函数,这样就可以实现屏幕显示与打印输出是一致的。2.3.3对话框类和控件类1.对话框类对话框有两种类型:对话框型应用程序和临时弹出式对话框,后者又可分为公用对话框、自定义对话框和属性选项卡三种类型。对话框和控件是Windows应用程序的另一种常见窗口。对话框用于在屏幕上显示一个带标题栏和边框的窗口,内部分布着各式各样的多个控件。控件是一种特定类型的输入输出窗口,用于与用户交互。对话框可有可无菜单栏,但一般没有工具栏和状态栏。对话框型应用程序是Windows的一种常见程序类型,如计算器和WindowsMediaPlayer,本教材中的许多程序也是对话框型应用程序。对话框型应用程序的对话框类是直接从CDialog类派生的。2.控件类控件是一种基本的图形用户界面单元,可用于输入或输出。所有控件都必须由相应的父窗口类(对话框类或表单视图类)管理。MFC提供了大量的控件类,还可使用第三方提供的ActiveX控件,以满足用户的各种需求。MFC控件类可分为三类,一类是在Windows3.x中就已支持的普通控件类,另一类是Windows95/NT/2000中支持的通用控件类,这些控件类都以”Ctrl”结尾。第三类是后期加入的对普通控件类的补充,也是从普通控件类派生的,称为附加控件类,适合于某些特殊应用。通用控件类只能运行在Windows95和/NT3.51及后续版本。另外,对于某些通用控件类来说,应用程序不能定义数据变量而只能创建控件对象。CObjectCCmdTargetCWndCDialogCCommonDialogCPropertyPageCEditCButtonCListBox对话框类和控件类在MFC体系中的层次如下图所示。3.对话框类和控件类的主要成员函数OnInitDialog初始化对话框DoModal显示模态对话框DoData

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功