在SDI框架下,一般只有退出而没有关闭文档的功能,或者说关闭了文件就退出了程序。为了实现关闭文档而不退出程序的功能,我们要做以下一些工作。
首先,如果只是实现“怎么关闭当前打开的文档,而不关闭当前程序”,还是比较简单的:
在菜单中添加一个“关闭文件”菜单,菜单ID选择ID_FILE_CLOSE,这是一个预定义的ID,也可以自己添加一个ID。在文档类中添加菜单消息响应:
这些代码是综合了CDocument::OnFileClose()和CDocument::OnCloseDocument()两个函数修改的,主要目的是实现关闭文档和视图而不关闭框架。
void C...Doc::OnClose()
{
// TODO: 在此添加命令处理程序代码
if (!SaveModified())
return;
BOOL bAutoDelete = m_bAutoDelete;
m_bAutoDelete = FALSE; // don't destroy document while closing views
while (!m_viewList.IsEmpty())
{
// get view attached to the document
CView* pView = (CView*)m_viewList.GetHead();
ASSERT_VALID(pView);
pView->DestroyWindow();
}
m_bAutoDelete = bAutoDelete;
// clean up contents of document before destroying the document itself
DeleteContents();
// delete the document if necessary
if (m_bAutoDelete)
delete this;
}
接下来的问题是这样关闭了视图之后,默认的单文档框架类没有绘制客户区,因此比较难看(试一下就知道了)。
这个问题比较简单,重载框架类的OnEraseBkgnd()函数自己绘制一个背景就可以了:
BOOL C...Frame::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rcClient;
GetClientRect(rcClient);
pDC->FillSolidRect(rcClient, GetSysColor(COLOR_APPWORKSPACE));
return TRUE;
//return CFrameWnd::OnEraseBkgnd