📄 05o016.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>
<body>
<div align="justify">
<table border="0" width="100%" class="font" height="57">
<tr>
<td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">VC知识库(五)</font>
</td>
<td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">www.vckbase.com</font>
</td>
</tr>
<tr>
<td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
Visual C++应用框架揭密
</td>
</tr>
<tr>
<td width="100%" height="17" class="info" align="center" colspan="2">
<center>
北京理工大学光电工程系 卢英威</center>
</td>
</tr>
<tr>
<td width="100%" height="22" class="font" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="5" class="font" colspan="2">
<center></center>
Visual C++应用框架提供的强大功能,为我们的程序开发
提供了极大的方便,利用其应用生成器可以很轻松地生成应用程序的框
架.许多常用功能,例如文档的创建,文件的打开,保存等操作的大部分代
码都由应用框架来完成.这些操作对于开发软件的用户而言,是透明的.
Microsoft公司的设计Visual C++的初衷是尽量向用户提供尽可能简单
的接口,但是,正是因为应用框架的这一透明性,使Visual C++的运行流
程显得非常神秘,当涉及这些Visual C++已经提供的功能模块的软件开
发时,用户(特别是那些刚刚接触Visual C++的)不知道什么时候该使用
什么接口函数,想改变Visual C++的一些默认操作时也不知道该从哪儿
下手,使开发的难度增加.<BR>
本人在编程实践中发现,可以通过Visual C++自带的强大
的Debug调试工具,跟踪应用框架代码,从而得出应用框架操作的部分流
程.具体实现是:利用Visual C++应用生成器生成应用框架代码,启动
Classwizard,在各个类中加入欲跟踪的接口函数,编辑接口函数,设置断
点,再启动Debug进行单步跟踪调试.利用这一方法,我们还可以跟踪
Visual C++提供的例子代码.在跟踪过程中,Visual C++的核心代码
是禁止跟踪调试的,我们只要跳过就行.<BR>
以下是本人对多文档应用程序的文档创建,文件的打开,
保存(另存为)操作的跟踪结果,单文档应用与多文档应用的操作流程
基本相似,只是用CSingleDocTemplate类的同名函数来替代对
CMultiDocTemplate类同名函数的调用.以下说明中,"应用程序"均指用户
生成的基于应用框架的实际程序,"用户代码"指用户在接口函数中加入
的代码.<P>
<B>一.创建文档</B><BR>
ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)<BR>
入口:CWinApp::OnFileNew<BR>
调用:CdocManager::OnFileNew()<BR>
1.判断有无文档模板,无则函数返回;<BR>
2.判断是否有多个文档模板,如有则启动文档模板选择对话框,
让用户选择一个模板后,返回模板指针.<BR>
3.由模板指针访问CMultiDocTemplate::OpenDocumentFile()<BR>
31.创建新文档对象<BR>
32.创建与新文档对象对应的子框架,构筑子框架,文档和视窗之间的关系<BR>
33.调用应用程序的OnNewDocument()<BR>
a.调用CDocument::OnNewDocument()<BR>
调用应用程序的DeleteContents();<BR>
b.用户代码<BR>
34.调用InitialUpdateFrame()显示视窗<BR>
35.返回文档指针<BR>
4.返回<P>
<B>二.打开文档</B><BR>
ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)<BR>
入口:CWinApp::OnFileOpen<BR>
调用:CDocManager::OnFileOpen()<BR>
1.弹出对话框让用户选择待打开的文件,返回该文件的全路径名称,
供下面函数调用时使用.<BR>
2.调用应用程序的OpenDocumentFile(LPCTSTR lpszFileName)<BR>
21.用户代码<BR>
22.调用CWinApp::OpenDocumentFile(lpszFileName),<BR>
调用CWinApp::OpenDocumentFile(lpszFileName),<BR>
调用CDocManager::OpenDocumentFile<BR>
a.判断有无该文件的打开文档对象,有则激活该窗口并返回<BR>
b.调用CMultiDocTemplate::OpenDocumentFile()<BR>
b1.创建新的文档对象,创建新文档对象对应的子框架<BR>
b2.调用应用程序的OnOpenDocument()<BR>
(1)调用CDocument::OnOpenDocument()<BR>
.打开文件对象<BR>
.调用应用程序的DeleteDontents();<BR>
.建立与此文件对象相关联的CArchive对象<BR>
.调用应用程序文档对象的Serialize()函数<BR>
.关闭CArchive对象,文件对象<BR>
(2)显示该文件窗口<BR>
b3.返回<P>
<B>三.文件保存</B><BR>
ON_COMMAND(ID_FILE_SAVE,CDocument::OnFileSave)<BR>
入口:CDocument::OnFileSave()<BR>
调用:CDocument::DoFileSave()<BR>
如果当前文档对应的文件名为空或者为只读文件,以NULL
为参数调用CDocument::DoSave(NULL),否则,以当前文档对应的
文件名为参数调用CDocument::DoSave(m_strPathName);<BR>
<BR>
ON_COMMAND(ID_FILE_SAVEAS,CDocument::OnFileSaveAs)<BR>
入口:CDocument::OnFileSaveAs()<BR>
以NULL为参数直接调用CDocument::DoSave(NULL);<BR>
CDocument::DoSave(LPCTSTR lpszPathName,BOOL bReplace);<BR>
如果lpszPathName为NULL,<BR>
1.设定应用程序默认的文件名<BR>
2.打开通用文件保存对话框,由用户设定保存文件的名字,并返
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -