最近看侯捷的MFC深入浅出,简单总结一下。

第一章首先就是先了解一下windows程序设计的基础知识,包括win32程序开发基础,什么*.lib,*.h,*.cpp的,程序入口点WinMain函数,窗口注册,消息循环,消息映射等。还有控制台(console)应用程序的运行过程以及与MFC的区别,进程与线程的诞生(CreatProcess()、CreateThread()、_beginthread()等)与消亡(ExitProcess()、endthread()等)。

第二章讲解了一些C++的重要性质,有this指针的使用,虚函数与多态,静态成员(函数与变量),执行时识别(RTTI),动态生成(Dynamic Creation),异常处理(Exception Handling),模板(Template)等。

  虚函数的总结:
  1 、 父类指针指向子类对象时,该指针只能引用父类的方法。
  2 、子类指针指向父类对象时,问题多多,需要强制转换,不符合实际。
  3 、父类和子类有同名成员函数时,父类指针永远只能调用父类方法而无论其指向是父类还是子类,子类指针也类似。
  如果你预期衍生类别有可能重新定义某一个成员函数,那么你就在基础类别中把此函数设为virtual。
  四种不同对象的生存方式:(in stack ,in heap,global,local static)
 

  void Func()
  {
    CObject ob;//在堆栈(stack)中产生ob对象
  }
  void Func()
  {
    CObject *ob = new CObject();//在堆(heap)中产生ob对象
  }
  CObject ob;//全局对象
  void Func()
  {
    static CObject ob;//局部静态对象,产生在固定的内存上(但是它既不是stack,也不是heap)
  }

  其中静态全局对象的构造必须依靠startup码实现,startup码是更早于程序进入点(main or WinMain)执行的代码,有C++编译器提供。

  模板总结

  1、模板函数

   例子: 

  template <class T>
  T power(T base, int exponent);

  其中的class不是C++中的class,这里它只是指一个普通的数据类型,而T就是一种具体的数据类型,且只有在调用函数时才确定T的值。宏观上说T可以是任何类型的数据类型,前提是函数内的操作合法,编译器能识别出。

  2、类模板

类的声明比较简单,比一般的类声明多了一行    template <class T>  

  template <class T>  //声明
class CTest
{
public :
CTest(T t1, T t2, T t3);
T Min();
T Max();
private:
T a, b, c;
};

函数的定义如下,规则就是:每一个成员函数前都要加上template <class T>,而且类别名称应该使用CTest<T>。

 template <class T>//这个必须加上
T CTest<T>::Min()
{
T minab = a < b ? a : b;
return minab < c ? minab : c;
}

类的使用如下,必须首先指定类型

 CTest<int> obj1(, , );    //int类型
cout << obj1.Min() << endl;
cout << obj1.Max() << endl; CTest<float> obj1(2.23, -3.35, 9.334); //float类型
cout << obj1.Min() << endl;
cout << obj1.Max() << endl;

第三章介绍MFC的六大关键技术,包括MFC初始化、执行时类型识别(RTTI)、动态生成(Dynamic Creation)、永久保存(Persistence)、消息映射(Message Mapping)、命令绕行(Command Routing)。

  1、MFC初始化----寻找main函数

  C++规定,全局对象的构造将比main或WinMain函数更早。 

  首先是全局构造

    CObject构造函数 -> CCmdTarget -> CWinThread -> CWinApp -> theApp构造函数

  然后进入WinMain函数

    WinMain -> AfxWinMain -> AfxWinInit -> theApp.InitApplication -> theApp.InitInstance

  接着执行线程过程。

    theApp.Run()

  最后清理

    AfxWinTerm

  2、执行时类型识别(RTTI)-- -- 查询父子关系(true or false)

  CRuntimeClass的实现要通过几个复杂的宏DECLARE_DYNAMIX(Cxxx)和IMPLEMENT_DYNAMIC(Cxxx,Cxxxbase),在类内部声明这两个宏,就可以将该类加入到类型识别库。而CObject的函数IsKindOf()则可以指向任何派生至CObject的类,然后调用它就可以找到基类。

  3、动态生成(Dynamic Creation) -----  如何从文件中读取一个类并实现它

  动态生成也通过CRuntimeClass来实现,加入两个成员变量,并通过宏来实现。DECLARE_DYNCREATE 和IMPLEMENT_DYNCREATE 。

  4、永久保存(Persistence) -- -- 将对象写入到文件(Serialize)

  这需要用到宏DECLARE_SERIAL  / IMPLEMENT_SERIAL,以及CObject的虚函数 virtual void Serialize(CArchive& ar);

  5 、消息映射(Message Mapping)---- 消息如何获取

  宏DECLARE_MESSAGE_MAP / BEGIN_MESSAGE_MAP / END_MESSAGE_MAP

  在WinMain函数里加入一死循环

   while (GetMessage (&msg, NULL, , ))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}

  6、命令绕行(Command Routing)---- 消息流动方向

   一般Window消息(WM_xxx),一定是从子类流向父类,不可能旁流。

   命令消息WM_COMMAND 的消息流向比较另类,可以横向流动

MFC深入浅出读书笔记第一部分的更多相关文章

  1. MFC深入浅出读书笔记第二部分2

    第七章  MFC骨干程序 所谓骨干程序就是指有AppWizard生成的MFC程序.如下图的层次关系是程序中常用的几个类,一定要熟记于心. 1 Document/View应用程序 CDocument存放 ...

  2. MFC深入浅出读书笔记第三部分1

    第八章 Document-View 深入探讨(总结) 1.Document Document 在MFC 的CDocument 里头被具体化.CDocument 本身并无任何具体数据,它只是提供一个空壳 ...

  3. MFC深入浅出读书笔记第二部分1

    第六章 MFC程序的生死因果 MFC学习过程,这个方法不错,条例清晰. 1.CWinApp  -- 取代WinMain地位 WinMain函数的功能由CWinApp的三个函数实现 virtual BO ...

  4. 《javascript权威指南》读书笔记——第一篇

    <javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...

  5. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  6. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  7. 《C++ Primer》读书笔记 第一章

    读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...

  8. [redis读书笔记] 第一部分 数据结构与对象 简单动态字符串

    本读书笔记主要来自于<<redis设计与实现>> -- 黄键宏(huangz) redis主要设计了字符串,链表,字典,跳跃表,整数集合,压缩列表来做为基本的数据结构,实现键值 ...

  9. 《css3实战》读书笔记 第一章 基于CSS需求而编写的HTML.

    笔记说明 <CSS3实战手册第3版(影印版)>可以消除Web设计工作的痛苦,并且带给你:HTML--重新入门.如果你是HTML新手,你会学到如何以CSS友好的方式进行基本页面构造.若你是H ...

随机推荐

  1. 逐步解读String类(一)

    一句题外话 面试刚入行的Java新手,侧重基础知识:面试有多年工作经验的老鸟,多侧重对具体问题的解决策略. 从一类面试题说起 考察刚入行菜鸟对基础知识的掌握程度,面试官提出关于String类的内容挺常 ...

  2. HDU 3697 Selecting courses 选课(贪心)

    题意: 一个学生要选课,给出一系列课程的可选时间(按分钟计),在同一时刻只能选一门课程(精确的),每隔5分钟才能选一次课,也就是说,从你第一次开始选课起,每过5分钟,要么选课,要么不选,不能隔6分钟再 ...

  3. C#环形缓冲区(队列)完全实现

    公司项目中经常设计到串口通信,TCP通信,而且大多都是实时的大数据的传输,然后大家都知道协议通讯肯定涉及到什么,封包.拆包.粘包.校验--什么鬼的概念一大堆,说简单点儿就是要一个高效率可复用的缓存区. ...

  4. Codeforces 802I Fake News (hard)

    Codeforces 802I 题意:统计所有不同子串出现次数的平方的和. 想法:建一个SAM,$Ans=\sum (step[i]-step[fa[i]])*right[i]^2$ #include ...

  5. ABAP Netweaver和Cloud Foundry上的环境变量Environment Variable

    Netweaver 更准确的说应该是系统变量:结构体sy 设一个断点,调试器里看这些字段的值就能知道每个字段是用来做什么的. sy-dbsys sy-sysid sy-opsys sy-saprl s ...

  6. Codeforces Round #327 (Div. 2) B Rebranding(映射)

    O(1)变换映射,最后一次性替换. #include<bits/stdc++.h> using namespace std; typedef long long ll; ; char s[ ...

  7. Android(java)学习笔记86:Android提供打开各种文件的API接口:setDataAndType

    1. Android 打开各种文件(setDataAndType) private void openFile(File file){ Intent intent = new Intent(); in ...

  8. 【洛谷2152】[SDOI2009] SuperGCD(Python好题)

    点此看题面 大致题意: 给你两个长度\(\le10000\)的正整数,让你求它们的\(gcd\). Python​ 高精请绕道. 这题的正解应该是Python. 对于这种高精题,肯定是Python最方 ...

  9. Linux内核参数min_free_kbytes

    1. min_free_kbytes 先看官方解释: This is used to force the Linux VM to keep a minimum number of kilobytes ...

  10. javaweb基础(26)_jsp标签库开发二

    一.JspFragment类介绍 javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段, ...