MFC APPWizard的原理与MFC程序框架的剖析

 AppWizard是一个源代码生成工具,是计算机辅助程序设计工具.
设计一个Test工程,则会产生类:
CAboutDlg:帮助
CMainFrame:由CFrameWnd派生出来,CFrameWnd是基础类库的一个类,是由CWnd派生出来的,窗口类,框架窗口。
CTestApp:由CWinApp派生出来,窗口对象
CTestDoc:由CDocument派生出来,是文档类,用于存储加载数据。而View用于显示数据,可以将数据的存储及显示分开。
CTestView:由CView派生出来,也是从CWnd派生出来的,也是窗口类
//CWnd封装了与窗口操作相关的类
窗口:设计、注册、产生、变化。但是在MFC中,没有这么明显的主线。因此学习比较困难。一定要掌握原理。
    WinMain函数是所有函数的入口,在MFC中,WinMain函数是在编译链接的时候有编译器链接到工程中的。可以查找MFC源代码查看WinMain函数。(WinMain函数在APPMODUL.CPP文件中)
    CWinApp是应用程序类,每个应用程序只能有一个。在MFC程序中,是通过产生应用程序对象来表示类。
    CWinApp类的代码在APPCODE.CPP中。CWinApp的构造函数中带了一个参数。但是在其子类的构造函数中可以不带参数,因为这个参数有一个缺省值NULL。
    在CWinApp的构造函数中,有PThreadState->n_pCurrentWinThread = this.//this指针是指向的派生类的对象
    在CWinApp类的继承类中要实现InitInstanse()函数,用于内部初始化管理。
     在WinMain函数中,有个AFxWinMain函数。AFX前缀指的是应用程序框架函数,是全局函数,在哪里都可以调用。(Application Frame X)。AFxWinMain在WINMAIN.cpp文件中。在这个函数中调用了AfxGetApp()。

    如何注册窗口类?
    是函数:AfxEndDeferRegisterClass()。在运行时调用此函数注册窗口类,根据不同的要求注册不同的类。在注册时,调用函数AfxRegisterClass()函数注册具体的类。
    如何产生窗口:现设定窗口的名字。在CFrameWnd中(由CWmd派生的),是框架窗口。而CView是子窗口。其中PreCreateWindow是产生窗口的函数。
    创建窗口:利用CreateWindow函数创建。此函数在WINCORE.CPP中。在Create函数中调用CreateEx函数。
    执行过程:
        全局变量代表应用程序本身的变量的初始化及分配内存空间;
        执行WinMain函数,跳至WinMain函数之中,在其中,执行InitInstance函数。
        InitInstance函数是个虚函数,而pThread是指向派生类的指针。则会调用子类的InitInstance
        然后进入AfxEndRegisterClass类进行窗口注册。进入框架类CMainFrame中的PreCreateWindow函数,在其中,调用基类的PreCreateWindow函数。然后在基类的PreCreateWindow中调用AfxEndRegisterClass类进行窗口类的注册。
        调用CFrameWnd中的Create函数。在Create函数中调用CreateEx(CreateEx是基类CWnd的函数)。
        继续运行,进入PreCreateWindow(是由CreateEx调用),是个虚函数,当调用的时候,实际是调用子类的PreCreateWindow。在此调用的好处:CreateStruct结构体是PreCreateWindow的参数。CreateWindowEx是CreateWindow的扩展函数,区别就是多了个参数。其参数与CreateStruct是一致的。CreateStruct结构体是为了在产生窗口时有机会去修改窗口的属性。当我们修改结构体中成员的值时,在基类中是可以体现出来的,则在创建窗口的时候,成员变量的值就修改了。
        Create函数实际上是在LoadFrame函数中调用的。

    显示及更新窗口:
        CWinApp成员变量:m_pMainWnd指针,指向主框架窗口。
        m_pMainWnd->ShowWindow(SW_SHOW);
        m_pMainWnd->UpdateWindow();        //窗口显示及更新
   
    消息循环:
      CWinThread::Run  //完成消息循环
      在Run中:有PumpMessage函数,此函数,当得到消息之后,将消息路由给操作系统,由操作系统给窗口执行。        采用消息映射机制,将消息交给消息相应函数处理。

    CView类也是一个窗口类,是覆盖在框架类窗口之上的。
   
    WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,Windows窗口与C++中的CWnd类的关系。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值