C++-->MFC

        MFC是一种重要的编程方法,它是微软公司的特定的应用程序包装接口。本节将讲解MFC概述及其类库结构。
        在MFC类库中,大约有200个类。在进行程序设计时,只需简单地调用已有的类及类中的方法即可。另外,还可以利用“继承”方法从已有类中派生出自己想要的类。这时,派生出来的类不但拥有父类中的方法和属性,还可以根据自己的需求,自定义一些特殊的属性和方法,使得派生类功能更加强大。MFC有较好的移植性,可应用于众多平台。

         MFC中类可划分为基类、应用程序结构类、窗口类、OLE类、数据库类等10大类,而且在其中的一些大类的基础上又派生出许多子类。MFC的类库结构的层次图如下图所示。


 

 

       从上图中可以看出,CObject是一个原始基类。绝大多数MFC类的最终基类都是CObject。原始基类下面,主要包括以下几种类:MFC应用程序结构类,窗口、对话框和控件类,输出(设备文本)和绘图类,简单数据类型类,数组、列表和映射类,文件和数据库类,Internet和网络类,OLE类以及高度和异常类。
MFC的应用程序结构类分为CWinApp和CWinThread。使用MFC创建的每一个应用程序都包含一个由类CWinApp派生而来的应用程序对象。该对象是一个全局对象。应用程序对象主要用于处理应用程序的初始化,同时也处理应用程序事件的消息循环。
CCmdTarget和CCmdUI为MFC中常用的有关发送命令的类。CDocument为MFC中常用的应用程序文档的基类。CDocTemplate为文档模版类,通常是应用程序的单文档或多文档的基类。CView类是常用的视图类。

      应用程序框架内部的AfxWinMain函数。根据其前缀Afx就知道WinMain是一个全局的MFC函数。

该对象是由CWinApp的派生类创建,因此有程序启动时,它就被创建好了。然后WinMain对该应用程序进行初始化,在此过程调用的是该程序全局构造对象的InitApplication()和InitInstance()函数。完成初始化后,WinMain调用Run()函数,运行应用程序的消息循环。最后结束应用程序时,WinMain调用AfxWinTerm()函数,做一些清理工作。
     2)initnstance()函数是初始化程序,每次启动winmain()函数会自动调用initlnstance()函数。在ShowWindow和UpdateWindos之前,程序要做两个动作,一个是注册窗口类,另一个是构建窗口类。InitInstance()函数规定了生成的应用程序是基于单文档的、基于多文档的或是基于对话框的。因此在CWinApp中必须重载InitInstance()函数。

    3)与查找WinMain函数类似,在Visual C++的安装目录下,按照下面这个路径依次打开文件夹,“F:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC”。打开后,会发现一个源文件“THRDCORE.CPP”。该文件中定义了应用类Run()函数

   4)Run() :如果消息队列没有消息,则调用OnIdle( )函数,并递增iIdleCount计数标志,该计数标志表示在两次消息处理过程只共调用了多少次OnIdle()函数。bIdle是消息队列空闲的标志,当消息队列有消息时,则调用PumpMessage()函数,进行消息翻译和消息派发。其中PreTranslateMessage(&m_msgCur)对消息进行翻译,DispatchMessage(&m_msgCur)把消息m_madCur发送到应用程序主框架窗口。
注意:在应用程序sample0201的CSample0201App的Run函数继承了CWinApp的虚函数Run()。而CWinApp的Run()函数调用了CWinThread的Run()函数。

       当MFC应用程序类中的Run()函数把消息交给主窗口的窗口函数后,窗口函数将如何处理这些消息。在Win32程序中,处理窗口消息的窗口函数WinProc()函数通过switch~case结构对消息进行判断并分别进行处理。但在MFC应用程序的主窗口类对消息的处理并没有沿袭Win32程序的做法。
MFC应用程序中进行消息处理,是为每一个要处理的消息添加一个消息处理函数。这种定义消息和消息处理函数的对照表,称为消息映射表。MFC的消息映射表采用映射宏的方式,将消息和消息处理函数一一对应起来。以应用程序的主框架为例,在类的声明文件MainFrame.h中添加声明消息映射的宏。

 

•在类的实现文件MainFrame.cpp中,添加消息映射宏的定义语句。
•其中,ID_MY_MESSAGE为自定义的菜单项命令ID号,OnMymessage()为响应菜单命令的成员函数。

 

   MFC的消息分为3类 :窗口消息、命令消息、控件消息。

 

 a、窗口消息的一般的表示形式是以“WM_”开头的消息。
WM_CHAR:使用键盘时产生的消息。其对应的消息处理函数为OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)。
WM_CREATE:创建窗口时产生的消息,用于窗口的初始化。其对应的消息处理函数为OnCreate(LPCREATESTRUCT lpCreateStruct)。
WM_PAINT:通知窗口对自身进行绘制。一般在移动窗口、改变窗口大小、绘制图形时使用。其对应的消息处理函数为OnPaint()。

WM_LBUTTONDOWM:使用鼠标左键时产生的消息。通知窗口单击了左键。其对应的消息处理函数为OnLButtonDown(UINT nFlags, CPoint point)。
WM_MOUSEMOVE:移动鼠标时产生的消息。其对应的消息处理函数为OnMouseMove(UINT nFlags, CPoint point)。
WM_CLOSE:关闭窗口时产生的消息。其对应的消息处理函数为OnClose()。
WM_DESTROY:销毁窗口时产生的消息。其对应的消息处理函数为OnDestroy()。

b、命令消息:

       命令消息一般与处理用户的某个请求或执行用户的某个命令有关。一般通过选择菜单项、单击工具栏按钮和按加速键产生命令消息。在MFC应用程序中,凡是从基类CCmdTarget派生出来的子类,都能处理命令消息。另外,文档类、视图类和应用程序类都能处理命令消息。
      创建命令消息时,可以使用MFC Class Wizard建立消息映射和消息处理函数之间的关系。例如,应用程序类发出文件打开命令,假设打开文件对应的菜单资源ID为ID_FILE_IPEN,则其命令消息如下:

c、控件消息:

普通的控件都是子窗口,因为其都继承自CWnd。它们通过向其父窗口(一般为对话框)发关消息,响应用户的动作(如移动鼠标,单击等)。控件消息一般是由按钮(BN_)、编辑框(EN_)、下拉列表框(LBN_)和组合框(CBN_)等控件产生的。其消息映射宏是在消息名前加上ON_,例如

on_CBN(编辑ID,响应函数)


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值