当前位置: 首页 > news >正文

MFC多文档程序,从菜单关闭一个文档和直接点击右上角的x效果不同

MFC多文档程序,从菜单关闭一个文档和直接点击右上角的x效果不同

若文档内容有修改,则前者会询问用户,是否保存修改;后者不保存修改直接关闭。
原因在于,从菜单关闭时,调用OnClose,一定会调用SaveModified(),其源码如下

/
// Standard file menu commandsvoid CDocument::OnFileClose()
{if (!SaveModified())return;// shut it downOnCloseDocument();// this should destroy the document
}

而点击x关闭时,CanCloseFrame()函数会判断是否保存文档,其源码如下:

BOOL CDocument::CanCloseFrame(CFrameWnd* pFrameArg)// permission to close all views using this frame//  (at least one of our views must be in this frame)
{ASSERT_VALID(pFrameArg);UNUSED(pFrameArg);   // unused in release buildsPOSITION pos = GetFirstViewPosition();while (pos != NULL){CView* pView = GetNextView(pos);ASSERT_VALID(pView);CFrameWnd* pFrame = pView->GetParentFrame();// assume frameless views are ok to closeif (pFrame != NULL){// assumes 1 document per frameASSERT_VALID(pFrame);if (pFrame->m_nWindow > 0)return TRUE;        // more than one frame refering to us}}// otherwise only one frame that we know aboutreturn SaveModified();
}

可见,仅当父框架的窗口为0时才会执行SaveModified()语句,其余情况都只会返回TRUE。在使用多文档编程时,要注意为了文档的安全,在自己重载的CanCloseFrame()中加上SaveModified()语句。

如何默默保存,不询问用户?

CDocument::SaveModified()的实现如下:

BOOL CDocument::SaveModified()
{if (!IsModified())return TRUE;        // ok to continue// get name/title of documentCString name;if (m_strPathName.IsEmpty()){// get name based on captionname = m_strTitle;if (name.IsEmpty())VERIFY(name.LoadString(AFX_IDS_UNTITLED));}else{// get name based on file title of path namename = m_strPathName;if (afxData.bMarked4){AfxGetFileTitle(m_strPathName, name.GetBuffer(_MAX_PATH), _MAX_PATH);name.ReleaseBuffer();}}CString prompt;AfxFormatString1(prompt, AFX_IDP_ASK_TO_SAVE, name);switch (AfxMessageBox(prompt, MB_YESNOCANCEL, AFX_IDP_ASK_TO_SAVE)){case IDCANCEL:return FALSE;       // don't continuecase IDYES:// If so, either Save or Update, as appropriateif (!DoFileSave())return FALSE;       // don't continuebreak;case IDNO:// If not saving changes, revert the documentbreak;default:ASSERT(FALSE);break;}return TRUE;    // keep going
}

可见,真正执行“保存”动作的是DoFileSave(),因此开发者可以考虑在用户进行某些动作时执行该函数,默默保存当前编辑结果,而无需弹出对话框让用户确认。

http://www.lryc.cn/news/167953.html

相关文章:

  • 【数据结构】C++实现AVL平衡树
  • 图神经网络系列之序章
  • Unity中 UI Shader的基本功能
  • 【自学开发之旅】Flask-标准化返回-连接数据库-分表-orm-migrate-增删改查(三)
  • numpy增删改查
  • 【kafka】kafka重要的集群参数配置
  • cs224w_colab3_2023 And cs224w_colab4_2023学习笔记
  • Cannot find module ‘prop-types‘
  • LeetCode-63-不同路径Ⅱ-动态规划
  • unity 使用Photon进行网络同步
  • 大数据课程M1——ELK的概述
  • C# byte[] 如何转换成byte*
  • MySQL与Oracle的分页
  • git基本手册
  • 每日一题(两数相加)
  • 恒运资本:沪指震荡涨0.28%,医药板块强势拉升,金融等板块上扬
  • 【计算机网络】Tcp详解
  • 最简单的laravel不使用任何扩展导出csv
  • Android studio 断点调试、日志断点
  • 服务器数据恢复-热备盘同步过程中硬盘离线的RAID5数据恢复案例
  • Python 使用input获取用户输入
  • Python 可迭代对象、迭代器、生成器
  • HTML的有序列表、无序列表、自定义列表
  • 银河麒麟安装Docker-国产化-九五小庞
  • 数据库与身份认证
  • LabVIEW开发锅炉汽包水位的监督控制和模拟
  • 2023-简单点-树莓派安装ncnn框架
  • Docker核心原理与实操
  • 虚幻引擎 UE5 增强输入系统
  • Mac 安装软件各种报错解决方案