MFC(Microsoft Foundation Classes)是微软公司提供的一个用于开发Windows应用程序的C++类库。在MFC中,单文档界面(SDI)是一种常见的应用程序类型,它允许用户同时打开多个文档窗口。本文将深入探讨MFC单文档视图(SDI)的调用机制,并提供一些实战技巧。
单文档视图(SDI)的基本概念
在MFC中,单文档视图应用程序通常由以下几个关键组件组成:
- 主框架窗口(CFrameWnd):应用程序的主窗口,负责管理菜单、工具栏、状态栏等界面元素。
- 文档模板(CDocumentTemplate):用于创建文档和视图的模板。
- 文档(CDocument):存储应用程序数据的对象。
- 视图(CView):显示文档数据的对象。
在SDI应用程序中,每个文档都有自己的视图,且这些视图共享同一个主框架窗口。
单文档视图的调用流程
以下是MFC单文档视图的典型调用流程:
- 创建应用程序:在MFC应用程序向导中,选择“单文档应用程序”。
- 创建主框架窗口:MFC会自动生成主框架窗口类(CMainFrame)。
- 创建文档模板:MFC会自动生成文档模板类(CMainFrame::CMainFrame)。
- 创建文档:当用户打开或创建一个新文档时,文档模板会创建一个新的文档对象。
- 创建视图:文档对象会创建一个与它关联的视图对象。
- 显示视图:视图对象被添加到主框架窗口中,并显示出来。
实战技巧
1. 文档和视图的创建
在MFC中,文档和视图的创建通常是通过文档模板自动完成的。但是,如果你需要手动创建它们,以下是一个简单的示例:
// 假设有一个CMyDocument和CMyView的派生类
CMyDocument* pDoc = new CMyDocument();
CMyView* pView = new CMyView();
2. 视图的更新
在文档数据发生变化时,你需要更新视图以反映这些变化。可以使用以下方法:
// 在CMyDocument中
void CMyDocument::UpdateAllViews(CView* pSender)
{
if (pSender == NULL)
{
// 更新所有视图
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CView* pView = pMainFrame->GetActiveView();
pView->Invalidate();
pView->Update();
}
else
{
// 只更新指定视图
pSender->Invalidate();
pSender->Update();
}
}
3. 文档的打开和保存
打开和保存文档是SDI应用程序的核心功能。以下是一个简单的示例:
// 打开文档
void CMainFrame::OnFileOpen()
{
CFileDialog fileDialog(TRUE, _T("*.txt"), NULL, OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST, _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*"));
if (fileDialog.DoModal() == IDOK)
{
CString strFileName = fileDialog.GetPathName();
CMyDocument* pDoc = GetActiveDocument();
pDoc->LoadFile(strFileName);
}
}
// 保存文档
void CMainFrame::OnFileSave()
{
CMyDocument* pDoc = GetActiveDocument();
if (pDoc->IsModified())
{
CFileDialog fileDialog(FALSE, _T("*.txt"), NULL, OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT, _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*"));
if (fileDialog.DoModal() == IDOK)
{
CString strFileName = fileDialog.GetPathName();
pDoc->SaveFile(strFileName);
}
}
}
4. 界面布局
合理布局界面是提高用户体验的关键。在MFC中,可以使用工具栏、状态栏和菜单等控件来组织界面。
// 添加工具栏
void CMainFrame::AddToolBar()
{
CToolBar* pToolBar = new CToolBar();
pToolBar->LoadToolBar(IDR_MAINFRAME);
pToolBar->SetBarStyle(CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndToolBar = pToolBar;
this->AddControlBar(&m_wndToolBar, AFX_IDW_TOOLBAR);
}
// 添加状态栏
void CMainFrame::AddStatusBar()
{
CStatusBar* pStatusBar = new CStatusBar();
pStatusBar->SetIndicators(new int[] { IDS_STATUSBAR1, IDS_STATUSBAR2 }, 2);
m_wndStatusBar = pStatusBar;
this->AddControlBar(&m_wndStatusBar, AFX_IDW_STATUSBAR);
}
通过以上实战技巧,你可以更好地掌握MFC单文档视图的调用机制,并开发出功能强大、界面友好的应用程序。
