文档视图结构中,缺省的命令处理
文档视图结构中,缺省的命令处理
FMD(http://www.fmdstudio.net)
文档视图结构中,缺省的命令处理
在文档视图结构所构建的框架中,很多命令ID都有缺省的命令处理。很多功能都由他们完成,但这些功能在程序中不“可见”,不便于对程序的理解。
以下归纳了常见的缺省处理及其流程
在需要时候,可以重载这些函数以实现特定功能
1.ID_FILE_NEW
2.ID_FILE_OPEN
3.ID_FILE_SAVE
4.ID_FILE_SAVE_AS
5.ID_FILE_SAVE_COPY_AS
6.ID_FILE_CLOSE
7.ID_FILE_UPDATE
8.ID_FILE_PRINT_SETUP
9.ID_FILE_PRINT
10.ID_FILE_PRINT_PREVIEW
11.缺省编辑控制ID
12.ID_WINDOW_NEW
13.ID_WINDOW_ARRANGE
14.ID_WINDOW_CASCADE
15.ID_WINDOW_TILE_HORZ
16.ID_WINDOW_TILE_VERT
17.ID_WINDOW_SPLIT
18.ID_APP_ABOUT
19.ID_APP_EXIT
20.ID_HELP_INDEX
21.ID_HELP_USING
22.ID_CONTEXT_HELP
23.ID_HELP
24.ID_DEFAULT_HELP
25.ID_NEXT_PANE
26.ID_PREV_PANE
27.ID_OLE_INSERT_NEW
28.ID_OLE_EDIT_LINKS
29.ID_VIEW_TOOLBAR
30.ID_VIEW_STATUS_BAR
1.ID_FILE_NEW
CWinApp::OnFileNew
调用m_pDocManager->OnFileNew()
void CDocManager::OnFileNew()
{
if (m_templateList.IsEmpty())
{
TRACE0("Error: no document templates registered with CWinApp.\n");
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
return;
}
CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead();
//如果含有多个文档模板,显示一个新建文档类型对话框
if (m_templateList.GetCount() > 1)
{
// more than one document template to choose from
// bring up dialog prompting user
CNewTypeDlg dlg(&m_templateList);
int nID = dlg.DoModal();
if (nID == IDOK)
pTemplate = dlg.m_pSelectedTemplate;
else
return; // none - cancel operation
}
ASSERT(pTemplate != NULL);
ASSERT_KINDOF(CDocTemplate, pTemplate);
//建立空文件
pTemplate->OpenDocumentFile(NULL);
// if returns NULL, the user has already been alerted
}
2.ID_FILE_OPEN
CWinApp::OnFileOpen
调用m_pDocManager->OnFileOpen()
void CDocManager::OnFileOpen()
{
//出现打开文件对话框文件取得文件名
CString newName;
if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
OFN_HIDEREADONLY ¦ OFN_FILEMUSTEXIST, TRUE, NULL))
return;
//使用OpenDocumentFile
AfxGetApp()->OpenDocumentFile(newName);
// if returns NULL, the user has already been alerted
}
3.ID_FILE_SAVE
CDocument::OnFileSave()
调用DoFileSave()
void CDocument::OnFileSave()
{
DoFileSave();
}
DoFileSave()又将调用DoSave()
BOOL CDocument::DoFileSave()
{
DWORD dwAttrib = GetFileAttributes(m_strPathName);
//如果文件是只读,或已经不存在了
if (dwAttrib & FILE_ATTRIBUTE_READONLY)
{
//使用带NULL参数的DoSave
if (!DoSave(NULL))
{
TRACE0("Warning: File save with new name failed.\n");
return FALSE;
}
}
else
{
//使用DoSave(....)
if (!DoSave(m_strPathName))
{
TRACE0("Warning: File save failed.\n");
return FALSE;
}
}
return TRUE;
}
