SDI:一次至多打开一个文档。
MDI:允许同时打开多个文档。
文档/视图基础知识:
框架窗口:CFrameWnd或其派生类。
视图:框架窗口同大小子窗口 CView/CScrollView或其派生类。
文档对象:保存应用数据。CDocument或其派生类。
应用程序对象
再看InitInstance
CSingleDocTemplate *pDocTemplate;
pDocTemplate = new CSingleDocTemplate
(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView)
);
AddDocTemplate(pDocTemplate);
SDI应用程序只注册一个文档类型。
MDI可注册多个。
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// 调CWinApp::OnFileNew启动应用
// 没文件名用空文档
// 有,用CWinApp::OpenDocumentFile加载一个文档。
// 这阶段,主结构用保存在文档模板中的信息创建文档,框架窗口,视图对象。
if(!ProcessShellCommand(cmdInfo))
{
return FALSE;
}
CDocument
几个非虚CDocument函数
函数名 | 说明 |
---|---|
GetFirstViewPosition | 返回POSITION |
GetNextView | 返回CView* |
GetPathName | 取得文档完整名 |
GetTitle | 取得文档标题 |
IsModified | 修改? |
SetModifiedFlag | |
UpdateAllViews | 调用每个与文档关联视图的OnUpdate |
几个CDocument虚函数
函数名 | 说明 |
---|---|
OnNewDocument | 新文档被创建时由主结构调用 |
OnOpenDocument | 从磁盘上装载文档时由主结构调用 |
DeleteContents | 主结构用其删除文档内容。用于文档关闭前释放分配给文档的资源 |
Serialize | 在文档,磁盘间输入,输出。文档被打开和关闭时由主结构调用 |
OnCloseDocument | |
OnSaveDocument | |
SaveModified | |
ReportSaveLoadException |
SDI中,MFC只实例化文档对象一次,文档文件打开,关闭,创建时,文档对象还是那个。
// 文档数据由原始数据和可串行化类组成时,所有输入/输出可用<<,>>完成
// 对其它类型,可用CArchive::Read,CArchive::Write,CArchive::ReadString,CArchive::WriteString,CArchive::GetFile
void CMyDoc::Serialize(CArchive &ar)
{
if(ar.IsStoring())
{
//
}
else
{
//
}
}
GetDocument () // 返回与视图关联的文档对象指针。
文档视图中,主结构产生WM_PAINT,创建CPaintDC对象,用指向该对象的指针调用视图的OnDraw。
CView的几个虚函数
函数名 | 说明 |
---|---|
OnDraw | 绘制显示 |
OnInitialUpdate | 视图和文档绑定时 |
OnUpdate | |
OnActiveView |
SDI:FrameWnd
MDI:CMDIFrameWnd。CMDIChildWnd。
// 动态对象创建
1.从CObject派生对象
2.
类声明中调用DECLARE_DYNCREATE
类实现中 IMPLEMENT_DYNCREATE
文档字符串是一个字符串资源。由7个用’\n’分隔的子字符串组成。
1.标题。
2.新文档标题。
3.SDI中不用的一个。
4.文档类型名。如:”Drawing Files(*.drw)”
5.某类型文档的默认文件扩展名。如”.drw”
6.不带空格的名字来标识注册时的文档类型。如“Draw.Document”
7.描述文档类型。如“Microsoft Draw Document”
CString strDefExt;
pDocTemplate->GetDocString(strDefExt, CDocTemplate::filterExt);
1.::RegCreateKey,::RegSetValue和其它Win32注册函数将输入项加入注册表。
2.MFC中,调用CWinApp::RegisterShellFileTypes并在调用AddDocTemplate后传入一个TRUE,可在应用,关联文档,操作系统命令解释器间建立链接。