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对象。
AddDocTemplate(pDocTemplate );
将创建好的单文档模板添加到CAPP的AddDocTemplate中
创建经理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();