MFC原理第一讲——20171218

MFC原理第一讲——20171218
    MFC是一种框架,在流行了二十几年,现在慢慢过时了,框架的设计思想都是差不多的,所以研究MFC原理便可触类傍通到其它框架。框架是对SDK的封装,通过类继承和多态给用户提供接口,写自己的代码,用起来很方便。有一些框架如金山的框架是开源的。
    (1)框架的作用及其中一些基本类
    用SDK开成软件需要1)写很多重复代码、2)响应消息处理比较麻烦,用框架开发正好可以弥补这些缺点,能使程序员快速开发。对于MFC框架来说,最初始的框架并不难理解,难的是在不断的升级和改版后,继承的类越来越多,研究起来才比较麻烦。MFC既然是对SDK的封装,那么其中必然会用到类的封装、继承和多态,MFC中使用到的初始类如下:1)所有类的基类CObject,2)消息处理类CCmdTarget,3)线程类CWinThread,4)系统APP类CWinApp,5)用户APP类C**App,6)窗口类CWnd。继承关系图如下:
 
    父子类之间关系是,子类用到父类的特性,于是就继承它,如很多类都要有处理消息的功能,那么这时就让这些类继承自CCmdTarget,父类中内容要慎填,因为如果很多的子类继承自它的话就很难改了,父类的作用也是将所有继承自它的类统一加上一个功能,就不用每个子类都加一遍了。MFC中全局变量为了不使用临界区影响效I率,同时又避免全局变量同步问题,用到了TLSAlloc系列函数。如AfxGetModuleState函数即是在TLS模块切换中使用的一个函数。
    (2)SDK中窗口注册、创建、显示更新、消息循环机制
    注册一个窗口类的作用是相当于创建一个有类名称和类窗口过程函数的类,而创建窗口则是创建注册的类的一个对象,并返回窗口句柄,当然其中得提供类名这一参数,当然还有其它,如注册窗口类和创建窗口类都可以绑定主模块句柄。显示更新很简单,直接调API就是了。消息循环基址代码如下:
MSG msg;
  BOOL bRet;
  while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
      //自第一次消息来之后,WM_QUIT消息之前便相当于是死循环了,WM_QUIT消息时GetMessage返回空
  {
    if (bRet == -1)
    {
      break;
    }
    else
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
   
  以上一段代码是死循环,只有在接收到WM_QUIT消息时才退出循环,一直循环的目的是向窗口不断地的派送消息,并且调相应窗口的过程函数,消息中记录了,其自身所属的窗口,所以当窗口很多时,照样派送无误。在窗口过程函数中,最后要调用默认的窗口过程函数,不然会有很多消息处理不了,然后程序就会崩掉。对应WM_DESTORY消息,在其中处理时,调用PostQuitMessage函数,作用是向消息队列传一个WM_QUIT消息,然后消息循环就会退出,程序才圆满退出。
posted @ 2017-12-20 12:03  DennyChenD  阅读(889)  评论(0编辑  收藏  举报