学习笔记一


前言:以下的学习笔记主要前几章的知识,最重要的为两个方面一个是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)三种资源


发布了24 篇原创文章 · 获赞 10 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章