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();

posted @ 2020-09-04 19:36  特权E5  阅读(209)  评论(0编辑  收藏  举报