上一篇 | 下一篇

MFC浅析(1)文档视图结构中,缺省的命令处理

发布: 2008-6-26 10:29 | 作者: admin | 来源: | 查看: 1次

文档视图结构中,缺省的命令处理

文档视图结构中,缺省的命令处理

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;

}

字号: | 推荐给好友

51/512345>

评分:0

我来说两句