您的位置:首页 > 其它

<mfc深入浅出>学习笔记一

2014-02-16 19:56 531 查看
前言:以下的学习笔记主要前几章的知识,最重要的为两个方面一个是mfc的仿真还有就是mfc的整个框架,加深了对document/view的理念。笔记主要是从书中摘抄的,如需详细了解可以去下侯捷老师的《mfc深入浅出》看看。

1.

call back 函数,意思是指「在你的程序中,被Windows 系统调用」

的函数。这些函数虽然由你设计,但是永远不会也不该被你调用,它们是为Windows 系

统准备的。

实际调用只是将函数的地址当做参数传递。

2.wm_close wm_destroy wm_quit

为什么结束一个程序复杂如斯?因为操作系统与应用程序职司不同,二者是互相合作的

关系,所以必需各做各的份内事,并互以消息通知对方

3.核心对象(event,mutes,semaphore,file,file_mapping,process,thread)

核心对象是系统的一种资源(噢,这说法对GDI 对象也适用),系统对象一

旦产生,任何应用程序都可以开启并使用该对象。系统给予核心对象一个计数值(usage

count)做为管理之用。

前三者用于执行线程的同步化:file-mapping 对象用于内存映射文件(memory mapping

file),process 和thread 对象则是本节的主角

4.

Frame1 并没有new 任何对象,反倒是有一个全域对象theApp 存在。

C++ 规定,全域对象的构造将比程序进入点(在DOS 环境为main,在Windows 环境为

WinMain)更早。

至于执行结果完全是c++构造函数在继承类中所表现的特性:先调用父类的构造函数,析构函数刚好相反

5.

从frame2可以看出mfc在初始化时,干了哪些事情 ;主要是两个初始化函数

CWinApp::InitApplication;CMyWinApp::InitInstance

6.RTTI(执行时期型别辨识)

类别型录网:这其实就是我们数据结构中学习的链表知识。意指针的形式把一个个类连接起来的;

为了构建者这样一个类图:微软巧妙的用宏画了这张图(这个宏怎么看都让人烦啊,最好自己手动的展开一个然后带入看看)

DECLARE_DYNAMIC /IMPLEMENT_DYNAMIC 宏

一个用于结构体的定义,一个用给结构体的赋值

frame3就是用上面的两个宏构建了一个类型型录网;需要注意的是在对于链表的都节点的特殊处理;

frame4就是在frame3的CObject 中加上IsKindOf 函数的声明与定义;用于判断类之间是否有亲属关系

7.Dynamic Creation (动态生成)

动态生成的困难点:你没有办法在程序执行期间,根据动态获得

的一个类别名称,要求程序产生一个对象

DECLARE_DYNCREATE /IMPLEMENT_DYNCREATE 宏

CObject* (PASCAL* m_pfnCreateObject)()这个函数指针保存了CObject* CreateObject()函数的指针,而这个函数在是现在过程

中动态创建了对应的类。

需要对应的类对象时,只需要调用m_pfnCreateObject这个指针指向的函数即可

8.从宏的定义我们很清楚可以看出,拥有动态生成(Dynamic Creation)能力的类别库,

必然亦拥有执行时期类型识别(RTTI)能力,因为_DYNCREATE 宏涵盖了_DYNAMIC

宏。

9.Persistence(永续生存)机制

Persistence,意思就是把对象永久保留下来

DECLARE_SERIAL/ IMPLEMENT_SERIAL 宏

这个东西看起来感觉蛮复杂的,不过有了动态生成的能力其实也很简单。就是本来由你输入类名生成,变成从文件中读再生成

10.Message Mapping(消息映射)

Windows 程序靠消息的流动而维护生命;

将消息与表格中的元素比对,然后调用对应的处理例程,这种动作我们也称之为消息映射(Message Mapping);

其实也是构建一张消息映射表,更上面的类别图一样。也是通过宏来实现的。

DECLARE_MESSAGE_MAP()//声明

//实现

BEGIN_MESSAGE_MAP(theClass, baseClass)

ON_COMMAND(id, memberFxn)

END_MESSAGE_MAP()

11.Command Routing(命令绕行)

其实就是用虚函数玩的把戏

12.工具这章直接跳过了:vs都出到13了,版本之间还是有区别的

13.第5章就是告诉我们mfc在软件项目的定位以及怎样的心态看待它。

其实mfc说到底就是个工具,而且还是个已经落伍的工具。微软现在都已经不再更新了。

当然只要微软不退出历史的舞台,mfc永远是有市场的。

MFC 是一个零组件超级市场,所贩卖的零组件功能以及零组件彼此之

间的关系都已定义好;我们选择自己喜欢的零件,兜出一个应用程序

14.当我们面临软件工业革命,我们的第一个考量点是:我的软件开发技术要从哪一个技术

面切入?从raw API 还是从高阶一点的工具?如果答案是后者,第二个考量点是我使用

哪一层级的工具?GUI toolkits 还是Class Library 还是Application Framework?如果答

案又是后者,第三个考量点是我使用哪一套产品?MFC 或OWL 或Open Class Library?

这个看了很有感触,如果我们只是因为公司用的mfc而只学习mfc,最终的成就必然很低啊。如果只是跟

着别人的脚步,永远只能更随而不能超越

15.1989 年微软公司成立Application Framework 技术团队,名为AFX 小组,用以开发C++

对象导向工具给Windows 应用程序开发人员使用

16.CWinApp 代表程序本体 取代 WinMain的地位

■ CFrameWnd 代表一个主框窗口(Frame Window) 取代 WndProc的地位

CWinApp 之中的成员变量将因为theApp 这个全域对象的诞生而获得配置与初值。如果

程序中没有theApp 存在,编译联结还是可以顺利通过,但执行时会出现系统错误消息

17.源代码部分,因为以前看过孙鑫老师的视频(推荐)再加上现在工作原因大概的东西我都了解。

CMyWinApp theApp; 程序就是从这启动的

(1)在构造theApp的时会调用程序的入口函数AfxWinMain()(可能不是直接调用的);

进入AfxWinMain(...)函数后一起就那么的熟悉了,

(2)先初始化AfxWinInit(...) 给theApp初始化,还有就是主线程的初始化

(3)InitApplication 初始文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板;

文档模板在mfc中很有用,就是靠它把几个主要的类联系到一起的

(4)InitInstance 调用我们自己的InitInstance 函数,常用在界面起来前做处理时一般都会在这函数

里面添加处理。使用过程中这个函数比较常见

(5)CWinApp::Run 程序生命的活水源头 ,是程序进入消息循环中

18.MFC 把消息主要分为三大类:为什么怎么分,这主要是有消息映射图的结构决定的

(1).标准Windows 消息(WM_xxx)的对映规则:

1、除WM_COMMAND之外,所有以WM_开头的消息。

2、从CWnd派生的类,都可以接收到这类消息。

(2)命令消息(WM_COMMAND)的一般性对映规则是

1、来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。

2、从CCmdTarget派生的类,都可以接收到这类消息。

(3)「Notification 消息

1、由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。

2、从CCmdTarget派生的类,都可以接收到这类消息。

总结:乍看MFC 应用程序代码,实在很难推想程序的进行。一开始是一个衍生自CWinApp 的全

域对象application object,然后是一个隐藏的WinMain 函数,调用application object 的

InitInstance 函数,将程序初始化。初始化动作包括构造一个窗口对象(CFrameWnd 物

件),而其构造式又调用CFrameWnd::Create 产生真正的窗口(并在产生之前要求MFC

注册窗口类别)。窗口产生后WinMain 又调用Run 激活消息循环,将WM_COMMAND

(IDM_ABOUT)和WM_PAINT 分别交给成员函数OnAbout 和OnPaint 处理。

18.Document Template 的意义

(1).程序每打开一份文件(资料),就应该产生三份对象:

1. 一份Document 对象,

2. 一份View 对象,

3. 一份CMDIChildWnd 对象(做为外框窗口)

(2)Document Template 接受了三种类别的CRuntimeClass 指针,于是每当使用者

打开一份文件,Document Template 就能够根据「类别型录网」),动态生

成出三个对象(document、view、document frame window)

(3)A.CMultiDocTemplate 构造式的第一个参数置入IDR_SCRIBTYPE,

代表RC 文件中的菜单(MENU)、图标(ICON)、字符串(STRING)三种资源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: