zoukankan      html  css  js  c++  java
  • MFC深入浅出读书笔记第一部分

    最近看侯捷的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)
     

     1  void Func()
     2   {
     3     CObject ob;//在堆栈(stack)中产生ob对象
     4   }
     5   void Func()
     6   {
     7     CObject *ob = new CObject();//在堆(heap)中产生ob对象
     8   }
     9   CObject ob;//全局对象
    10   void Func()
    11   {
    12     static CObject ob;//局部静态对象,产生在固定的内存上(但是它既不是stack,也不是heap)
    13   }

      其中静态全局对象的构造必须依靠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>  

     1  template <class T>  //声明
     2  class CTest
     3  {
     4     public :
     5      CTest(T t1, T t2, T t3);
     6      T Min();
     7      T Max();
     8      private:
     9      T a, b, c;
    10  };

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

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

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

    1 CTest<int> obj1(2, 5, 4);    //int类型
    2      cout << obj1.Min() << endl;
    3      cout << obj1.Max() << endl;
    4 
    5 CTest<float> obj1(2.23, -3.35, 9.334);    //float类型
    6      cout << obj1.Min() << endl;
    7      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函数里加入一死循环

    1   while (GetMessage (&msg, NULL, 0, 0))
    2      {
    3            TranslateMessage (&msg) ;
    4            DispatchMessage (&msg) ;       
    5      }

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

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

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

  • 相关阅读:
    数据库目录
    设计模式
    mysql的索引结构
    ElasticSearch的基本操作
    转:基于Hadoop 的分布式网络爬虫技术学习笔记
    爬虫 es 搜索引擎
    vue+django2.0.2-rest-framework 生鲜项目
    fiddler抓包时显示Tunnel to......443
    安装 Win10 + Ubuntu 双系统过程
    ROS 订阅者的创建及使用
  • 原文地址:https://www.cnblogs.com/songliquan/p/3282110.html
Copyright © 2011-2022 走看看