MFC是一个编程框架MFC中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序。
MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法。
AppWizard可以用来生成初步的框架文件。
资源编辑器用于帮助直观的设计用户接口。
ClassWizard用来协助添加代码到框架文件,最后,通过类库实现了应用程序特定的逻辑。
MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的。
而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理。
框架或者由其本身处理事件,不依赖程序员的代码,或者调用程序员的代码来处理应用程序特定的事件。
1.S DI生成1.步骤dxq2009首先,打开VC++6.0开发环境,然后,选择”File”菜单中的“New”子菜单,在弹出的对话框中选择“MFC AppWizard(exe)”项并在“Progect name”编辑框中输入合适的工程名字Simple1,如图,它的意思是创建一个基于MFC的应用,接着进入正式的创建过程,MFC 应用程序的创建过程有6步(基于对话框)或者6步(SDI或者MDI),下面首先介绍SDI 应用的创建过程。
(1)第一步用于选择应用的结构以及语言等。
如图1,首先确定应用是否需要Doc/View Architecture Support支持,因为不使用该结构的应用不支持从磁盘文件打开文档,也没有派生于类CWnd的窗口客户区。
上面3个单选按钮用于确定创建的应用类型,包括单文档,多文档,对话框,这里选择第一个。
然后从资源列表框选择应用所使用的语言种类,单击“Next”。
图1(2)第二步为用用程序选择4项数据库支持选项之一:如图2.如果选择了数据库支持,那么单击“Data Source”按钮,选择外部的数据库表项,一般按默认即可,单击“Next”。
图2(3)第三步选择希望包含在应用中的复合文档支持项,同时判定是否启用标准的ActiveX 资源,以及是否为应用的菜单条添加额外的自动化命令等,如图4,一般安默认,单击“Next”图4(4)第四步用于选择应用所需的基本用户接口特征,以及所想使用的工具栏类型,如图5,如果想要修改应用所使用的文件名和扩展名,或者想要调整应用的用户接口和框架风格,就单击“Advanced”,然后修改,一般默认,单击“Next”。
图5(5)第五步设置工程的风格,Explorer风格的应用类似于资源管理器,标准MFC风格带有文件视图区域,还要判定是否希望应用向导在源文件中生成注释,最后选择MFC库时动态链接还是静态链接,如图6单击“Next”。
图6(6)第六步可以更改由应用向导提供的默认类型,基类,头文件和实现文件名,对于视图,还可以更改它的基类,如图7,一般默认,单击”Finish”,在弹出的工程信息对话框中点击“OK”即结束应用的创建过程。
图72.MFC工程的成员类及全局对象应用向导可以自动地生成MFC应用的各个C++类,另外,还能自动的生成一个类APP的全局对象theApp,如图8下面做简要说明。
图81.应用类及全局对象(CCExcmpleApp)应用类封装了Windows应用的初始化,运行以及终止的全过程。
对于每一个基于框架的应用,它必须有一个且只能有一个派生于CWinApp的类对象。
这个对象是全局对象,因此它在创建任何窗口前首先被构造。
类CWinApp提供了几个关键的可重载的虚成员函数,他们是InitInstance,Run,ExitInstance以及OnIdle等。
而且,在程序中可以随时调用全局函数AfxGetApp,以便获得CWinApp类对象的指针。
2.文档类(CCExcmpleDoc)文档类实际上是一种数据结构,该类实现了对这种结构的封装以利于管理,通常,它不但包含应用中所需的数据,而且也包含了处理这些数据的方法,另外,文档类还可以为应用提供与其存储的数据相关的服务。
3.视图类(CCExcmpleView)该类占有框架窗口的客户区,主要负责显示文档数据,也为文档对象和用户之间提供了用以交互的可视接口,另外,也完成了与文档打印相关的操作,通常,一般的绘制操作都是在该类中完成,因此有时也称视图类窗口为“绘制窗口”。
4.框架类(CMainFrame)框架类表示应用程序的主框架窗口,其主要作用是响应标准的窗口消息,不过,它通常先将消息按照一定的次序传递给视图类以及文档类等其他命令处理类,另外,它还为视图类提供可视化的边框,同时也包括标题栏,一些标准的窗口组件等。
5.“关于”对话框类(CAboutDlg)该类封装了用于显示软件版本,版权等相关信息的“关于”对话框,通常不需要对它进行任何的编程。
而只需要使用对话框资源编辑器对对话框模板进行简单的编辑即可。
3.源文件结构:应用向导生成的应用程序具有很多原始的功能,例如:打开文件对话框等,而且还可以使用类向导向某个类添加成员函数或者成员变量,而且类向导可以将添加的成员安排在何时得位置。
应用向导和类向导时怎么样实现这些自动功能呢?下面先浏览一下CCExcmpleView的头文件:// CExcmpleView.h : interface of the CCExcmpleView class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_CEXCMPLEVIEW_H__4FEB3544_9956_4E4C_93C9_35D40796D187__INCLUDED_) #define AFX_CEXCMPLEVIEW_H__4FEB3544_9956_4E4C_93C9_35D40796D187__INCLUDED_#if _MSC_VER > 1000#pragma once#endif// _MSC_VER > 1000class CCExcmpleView : public CView{//Constructorsprotected: //create from serialization onlyCCExcmpleView();DECLARE_DYNCREATE(CCExcmpleView)//Attributespublic:CCExcmpleDoc* GetDocument();//Operationspublic://Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CCExcmpleView)public:virtual void OnDraw(CDC* pDC); // overridden to draw this viewvirtual 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// Implementationpublic:virtual ~CCExcmpleView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// Generated message map functionsprotected://{{AFX_MSG(CCExcmpleView)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef _DEBUG // debug version in CExcmpleView.cppinline CCExcmpleDoc* CCExcmpleView::GetDocument(){ return (CCExcmpleDoc*)m_pDocument; }#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCA TION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_CEXCMPLEVIEW_H__4FEB3544_9956_4E4C_93C9_35D40796D187__INCLUDED_)该代码的作用是声明CCExcmpleView类,但是这个声明包含在一个“#iif…#define…#endif”结构内,其目的时保证编译时此文件只被包含一次。
下面介绍下头文件的组成部分。
主要由注释块,访问类型以及分界符。
1.注释块:用“//”引导的绿色部分Constructors块:构造块,用于声明该类的C++构造函数,以及所需的各种初始化函数。
Attributes块: 共性或属性快,用于包含对象的共性或属性,Operations块:操作块,用于包含成员函数,可以通过对象调用这些函数,以使该对象执行需要的任务或操作,Overridables块:重载块,该块用于包含虚函数,当需要更改基类的行为时,可以在派生类中重载这些函数。
Implementation块;实现块,是MFC类声明中最重要的部分。
实现块包括所有的实现信息,包括成员变量和成员函数。
2.访问类型。
Public ,protected,private3.分界符:从上面的代码可以看到如“//{{AFX_MSG(CCExcmpleView)”等的标识符,类向导使用几种特殊的分界符,用以区分向导生成的代码和用户输入的代码,这些格式化的分界符以注释的形式出现在代码中。