在SDI框架下实现关闭文档而不退出程序的功能

本文档介绍如何在SDI框架中实现关闭文档而不退出程序的功能。通过添加关闭文件菜单,响应ID_FILE_CLOSE消息,重载OnFileClose()和OnCloseDocument()函数,以及自定义文档模板类,解决了关闭视图后框架窗口未绘制的问题,并防止新建文档时创建额外框架窗口。通过重载OpenDocumentFile()函数,确保了关闭文档后的正确行为。
摘要由CSDN通过智能技术生成

在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值