没有合适的资源?快使用搜索试试~ 我知道了~
首页学习MFC框架如何创建的过程.pdf
资源详情
资源评论
资源推荐

温故而知新,学习 MFC 框架如何创建的过程
很久没有使用 MFC 了,以至于都忘记 MFC 框架复杂的窗口、文档、视的创建过程了。
下面我们跟踪一个 MFC MDI 的应用程序,来温习或学习一下。
使用 AppWizard 创建一个 MDI 应用程序,我创建的应用程序叫 MDITest,这样 MFC 生成
了如下的类:
类名 作用
CMDITestApp
派生于 CWinApp 的应用程序类。
CMainFrame
派生于 CMDIFrameWnd 的 MDI 框架窗口类。
CMDITestDoc
派生于 CDocument 的文档类。
CChildFrame
派生于 CMDIChildWnd 的 MDI 子窗口类。
CMDITestView
派生于 CView 的文档显示类。
在运行时刻,CMainFrame, CChildFrame, CMDITestView 的窗口关系如下面
的表格示出:
CMainFrame
(Menu, Toolbar …)
MDIClient
CChildFrame
CMDITestView
pDocument = *CMDITestDoc (带有文档的指针)
[StatusBar]
其中,最外层的是顶层窗口 CMainFrame,里面包含一个 MDIClient 窗口。
CChildFrame 做为子窗口包含于 MDIClient 中(可以包含多个),CChildFrame
里面则是真实的文档表示窗口 CMDITestView 了。
我们从这里开始:
// CMDITestApp 初始化
BOOL CMDITestApp::InitInstance()
欢迎阅读

做为 CWinApp 的派生类,通常需要重载 InitInstance(), ExitInstance()
两个函数,以完成应用的初始化和退出。我们现在关心 InitInstance 中关于文
档模板、窗口处理的部分,而忽略掉一些 CommonControl, OLE 初始化部分。
整个 InitInstance 代码如下:
BOOL CMDITestApp::InitInstance()
{
InitCommonControls(); // 这里删减了大量注释和错误处理
CWinApp::InitInstance();
AfxOleInit();
AfxEnableControlContainer();
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
LoadStdProfileSettings(4); // 加载标准 INI 文件选项(包括 MRU)
TRACE("Before CMultiDocTemplate\n");
// 注册应用程序的文档模板。文档模板
// 将用作文档、框架窗口和视图之间的连接
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE,
RUNTIME_CLASS(CMDITestDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMDITestView));
if (!pDocTemplate)
return FALSE;
TRACE("Before AddDocTemplate\n");
AddDocTemplate(pDocTemplate);
// 创建主 MDI 框架窗口
TRACE("Before new CMainFrame\n");
CMainFrame* pMainFrame = new CMainFrame;
TRACE("Before pMainFrame->LoadFrame\n");
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
TRACE("Before ParseCommandLine\n");
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 调度在命令行中指定的命令。如果
// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
TRACE("Before ProcessShellCommand\n");
if (!ProcessShellCommand(cmdInfo))
return FALSE;
欢迎阅读

TRACE("Before pMainFrame->ShowWindow\n");
// 主窗口已初始化,因此显示它并对其进行更新
pMainFrame->ShowWindow(m_nCmdShow);
TRACE("Before pMainFrame->UpdateWindow\n");
pMainFrame->UpdateWindow();
return TRUE;
}
为了研究整个创建过程,我在其中添加了一些 TRACE 来跟踪创建顺序。
忽略掉开始的乱七八糟的初始化,从 CMultiDocTemplate 开始:
CMultiDocTemplate* pDocTemplate = new CMultiDocTemplate(IDR_MDITestTYPE,
RUNTIME_CLASS(CMDITestDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CMDITestView));
AddDocTemplate(pDocTemplate);
(作了一点点简化)
这里首先创建了一个 CMultiDocTemplate —— 文档模板,文档模板包括
的三个运行时刻类信息:Document – CMDITestDoc, FrameWnd – CChildFrame,
View – CMDITestView。
然后通过 AddDocTemplate 函数将新创建的文档模板添加到模板管理器之中
(我们以后再研究模板管理器)。
然后创建主框架窗口 CMainFrame:
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
其中,需要研究的是 LoadFrame 的实现,以及里面都做了些什么。我们稍后研究。
处理命令行,在这里第一个空文档被建立出来:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 调度在命令行中指定的命令。如果用 /RegServer、/Register、/Unregserver 或
/Unregister 启动应用程序,则返回 FALSE。
if (!ProcessShellCommand(cmdInfo)) // 这里创建
出初始空文档
return FALSE;
我们一会会重点研究 ProcessShellCommand。
欢迎阅读
剩余11页未读,继续阅读















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0