zoukankan      html  css  js  c++  java
  • MFC框架的大致介绍

    文档模板管理者类CDocManager它管理应用程序所包含的文档模板CDocTemplate

    CDocManager类维护一个CPtrList类型的链表m_templateList(即文档模板链表)

    CSingleDocTemplate类,定义了一个文档模板用于实现单文档界面(SDI)即单文档类

    文档模板类CDocTemplate是抽象的基类它定义了文档模板的基本处理函数接口。对一个单文档界面程序,需使用单文档模板类CSingleDocTemplate,而对于一个多文档界面程序,需使用多文档模板类CMultipleDocTemplate。

    通过文档模板,程序确定了创建或打开一个文档时,以什么样的视图和框架窗口来显示。文档模板依靠保存相互对应的文档、视图和框架窗口的CRuntimeClass对象指针来实现上述挂接,这就是文档模板类中的成员变量m_pDocClass、m_pFrameClass、m_pViewClass的由来。

    以单文档为例  CAPP的InitInstance中

    创建了一个CSingleDocTemplate*  pDocTemplate 单文档类的指针

    pDocTemplate = new CSingleDocTemplate(

    0,

    RUNTIME_CLASS(CMyDoc),

    RUNTIME_CLASS(CMainFrame),       // main SDI frame window

    RUNTIME_CLASS(CMyView));

    通过带掺构造

    CSingleDocTemplate::CSingleDocTemplate(

    UINT nIDResource,

    CRuntimeClass* pDocClass,

     CRuntimeClass* pFrameClass,

     CRuntimeClass* pViewClass)

    : CDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass){}

    单文档类将指针传给文档模板

    CDocTemplate::CDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass,

    CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)

    {

    m_nIDResource = nIDResource;

    m_pDocClass = pDocClass;

    m_pFrameClass = pFrameClass;

    m_pViewClass = pViewClass;

    }

    文档模板将文档、视图和框架窗口类的指针保存在CRuntimeClass 对象中。当构造文档模板时,指定了CRuntimeClass对象。

    AddDocTemplatepDocTemplate ;

    将创建好的单文档模板添加到CAPPAddDocTemplate

    创建经理CDocManager 来管理这些文档模板 CDocManager 里面有链表

    void CWinApp::AddDocTemplate(CDocTemplate* pTemplate)

    {

        If (m_pDocManager == NULL)

    m_pDocManager = new CDocManager;

        m_pDocManager->AddDocTemplate(pTemplate);

    }

    CView相当于在原来的窗口添加了一个无其他内容的空白窗口是原来的子窗口

    在创建完客户区后就将子窗口创建和主窗口绑定在一起

    BOOL CFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,

    CWnd* pParentWnd, CCreateContext* pContext)

    {

      WNDCLASS wc;

      wc.style = CS_HREDRAW | CS_VREDRAW;

      wc.lpfnWndProc = (WNDPROC) DefWindowProc;

      wc.cbClsExtra = 0;

      wc.cbWndExtra = 0;

      wc.hInstance = ::GetModuleHandle(NULL);

      wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

      wc.hCursor = LoadCursor(NULL, IDC_ARROW);

      wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

      wc.lpszMenuName =  NULL;

      wc.lpszClassName = "CR33 MFC";

      

      if (!RegisterClass(&wc))

        return FALSE;

      

      if (!Create(wc.lpszClassName, "CR33 MFC", dwDefaultStyle, rectDefault,

        pParentWnd, MAKEINTRESOURCE(nIDResource), 0L, pContext))

      {

        return FALSE;   // will self destruct on failure normally

      }

      

      //创建客户区,view

      OnCreateClient(NULL, pContext);

      return TRUE;

    }

    类的创建在这个函数中

    if (!ProcessShellCommand(cmdInfo))

    return FALSE;

    在里面首先调用了

    void CWinApp::OnFileNew()

    {

    if (m_pDocManager != NULL)

    m_pDocManager->OnFileNew();

    }

    void CDocManager::OnFileNew()在这里面调用了

    CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();

    pTemplate->OpenDocumentFile(NULL);

    CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,

    BOOL bMakeVisible)

    这个函数中创建了 pDocument  和 pFrame 对象

    pDocument = CreateNewDocument();

    pFrame = CreateNewFrame(pDocument, NULL);

    CDocument* pDocument = (CDocument*)m_pDocClass->CreateObject();

    CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();

    在产生CFrameWnd这个对象的函数中调用了LoadFrame

    CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)

    pFrame->LoadFrame(m_nIDResource,

    WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles

    NULL, &context)

    LoadFrame中CWnd* CFrameWnd::CreateView(CCreateContext* pContext, UINT nID)

    CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();

    学如逆水行舟,不进则退。 博客园技术交流群 群 号:1073255314 (本群没人,刚刚建立 -_-!!! )
  • 相关阅读:
    C++基础学习笔记----第十三课(操作符重载-下)
    SSH搭建
    java(17)
    英语语法检查软件
    Ubuntu sudo apt-get 安装下载更新软件包命令详解
    MATLAB:控制系统模型变换
    solvepnp
    MATLAB:控制系统模型变换
    MATLAB实现传递函数
    visual studio编译cmake opencv一直出错
  • 原文地址:https://www.cnblogs.com/Mj-NaijAm/p/13615799.html
Copyright © 2011-2022 走看看