免费做网站可以一直用吗,忻州网站建设哪家好,admin后台管理系统,wordpress前台投稿MFC多文档程序#xff0c;从菜单关闭一个文档和直接点击右上角的x效果不同
若文档内容有修改#xff0c;则前者会询问用户#xff0c;是否保存修改#xff1b;后者不保存修改直接关闭。 原因在于#xff0c;从菜单关闭时#xff0c;调用OnClose#xff0c;一定会调用Sa…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; // dont continuecase IDYES:// If so, either Save or Update, as appropriateif (!DoFileSave())return FALSE; // dont continuebreak;case IDNO:// If not saving changes, revert the documentbreak;default:ASSERT(FALSE);break;}return TRUE; // keep going
}可见真正执行“保存”动作的是DoFileSave()因此开发者可以考虑在用户进行某些动作时执行该函数默默保存当前编辑结果而无需弹出对话框让用户确认。