整理MFC的框架

关键点:

  1. winapp等框架的关系及其继承类;
  2. 文档与视图或者mainframe等之间的关系;

需解释:

::SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd,IDC_EDIT_FreeDisk,strFreeDisk);

CWinThread::m_pMainWnd,存储你的线程主窗口对象。当和m_pMainWnd 相关的窗口被关闭后,MFC会自动终止你的线程。如果该线程是应用程序主线程,程序也将会被终止。如果该数据成员为NULL,应用程序CWinApp对象的主窗口将用来决定什么时候去终止线程。m_pMainWnd是一个CWnd*类型的public变量。你需要在重载InitInstance时为m_pMainWnd赋值。在工作线程中,m_pMainWnd自动继承其父线程的值。
补充:只有CWinThread对象才有m_pMainWnd

Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行软件开发。
下面分析MFC应用程序

  1. 首先在HelloWorld.cpp中定义全局对象theApp:CHelloWorldApp theApp;。调用CWinApp和CHelloWorldApp的构造函数后,进入WinMain函数(位于appmodul.cpp中)。然后,调用了AfxWinMain函数。
    InitInstance中的ProcessShellCommand函数又调用了CMainFrame的LoadFrame函数注册并创建了窗口,执行完ProcessShellCommand函数以后,调用了m_pMainWnd的ShowWindow和UpdateWindow函数显示并更新框架窗口。
  2. 消息循环。AfxWinMain函数中调用了pThread的Run函数(位于THRDCORE.cpp中),在Run中包含了消息循环。PumpMessage中通过调用GetMessage、TranslateMessage、DispatchMessage等建立了消息循环并投递消息。

CHelloWorldApp类处理消息,将收到的消息分发给相应的对象。
CMainFrame是视图CHelloWorldView的父窗口,视图CHelloWorldView就显示在CMainFrame的客户区中。视图类CHelloWorldView用来显示文档类CHelloWorldDoc中的数据,并根据对视图类的操作修改文档类的数据。
一个视图类只能跟一个文档类相联系,而一个文档类可以跟多个视图类相联系。

文档、视图和框架:各对象之间的关系
涉及到的对象主要有:应用程序对象、文档模板对象、文档对象、视图对象和框架窗口对象等。

  1. 应用程序对象保存了一个文档模板的列表。在任何对象中调用全局函数AfxGetApp都可以获得应用程序对象的指针。通过调用CWinAppEx::GetFirstDocTemplatePosition、CWinAppEx::GetNextDocTemplate函数可以遍历所有的文档模板。
  2. 文档模板对象用于维护文档、视图和框架窗口的映射关系,它包含有一个已打开文档的列表。我们可以通过调用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc来遍历该文档模板对应的所有文档。
  3. 框架窗口对象中包含有指向当前活动视图对象的指针。
    AfxGetApp()->m_pMainWnd即为主框架窗口对象的指针。我们可以通过调用CFrameWndEx::GetActiveView来获取当前活动视图对象的指针,并且使用CFrameWndEx::GetActiveDocument函数可以获得当前活动视图对应的文档。
  4. 文档对象中维护着该文档的视图列表,以及创建该文档的文档模板对象的指针。我们可以通过调用CDocument::GetFirstViewPosition,CDocument::GetNextView来遍历该文档关联的所有视图,调用CDocument::GetDocTemplate获取创建该文档的文档模板对象的指针。
  5. 视图是框架窗口的子窗口,它保存有指向对应的文档对象的指针。我们可以通过调用CView::GetParentFrame获取其所属的框架窗口对象的指针,调用CView::GetDocument获取该视图对应的文档对象的指针
    另外,在MDI多文档程序中,调用CMDIFrameWnd::MDIGetActive可以获取当前活动的MDI子窗口
    文档和视图是一对多的关系。 每个文档对象都保存着一个视图列表
    CDocument::AddView函数添加视图,
    CDocument::RemoveView函数删除视图,
    CDocument::UpdateAllViews函数在数据发生变化时,更新所有视图。
  6. 文档模板文档模板中存放了与文档、视图和框架相关的信息。应用程序通过文档模板创建文档对象、框架窗口对象和视图对象。另外,文档、视图和框架之间的关系也是由文档模板来管理的。

mfc中,

    CSingleDocTemplate* pDocTemplate;   //创建单文档对象
    pDocTemplate = new CSingleDocTemplate(   
        IDR_MAINFRAME,   //资源ID
        RUNTIME_CLASS(CExample34Doc),   
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window   
        RUNTIME_CLASS(CExample34View));   
    if (!pDocTemplate)   
        return FALSE;   
    AddDocTemplate(pDocTemplate); //注册文档模板对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值