在开发基于MFC的应用程序时,经常需要对文件保存功能进行定制,以满足特定的需求。例如,可能希望在用户保存文件时自动将文件保存为自定义格式,而不是让用户通过标准的“另存为”对话框选择文件类型。本文将介绍如何通过重写MFC中的CDocument类的DoSave方法来实现这样的自定义文件保存机制,并探讨其在不同场景下的应用。
在MFC中,文件的保存操作通常由CDocument类的DoSave方法控制。默认情况下,当用户点击工具栏上的保存图标或从文件菜单中选择“保存”时,系统会调用DoSave方法。如果用户选择了“另存为”,则系统会调用DoSave方法,并将文件路径参数设置为NULL,此时会弹出“另存为”对话框让用户选择保存路径和文件名。
为了实现自定义的保存机制,需要重写DoSave方法。在重写的方法中,可以通过检查传入的文件路径参数来决定是否需要弹出“另存为”对话框。如果参数为NULL,可以调用CWinApp::DoPromptFileName方法来显示对话框;如果参数非NULL,则可以直接保存文件。
BOOL CBmpToXyzDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
CString DestPath = SrcPath;
DestPath.Replace("bmp", "xyz");
OnSaveDocument(DestPath);
return TRUE;
}
在上面的代码示例中,首先获取当前文件的完整路径,然后将文件扩展名从"bmp"更改为自定义的"xyz"。接着,调用OnSaveDocument方法来保存文件。这样,用户就不会被提示“另存为”对话框,文件将直接以新的扩展名保存。
除了实现基本的自定义保存机制外,DoSave方法还可以用于更复杂的场景。例如,可以根据文件的当前格式来决定保存对话框的过滤器。如果当前文件是GIF格式,可能希望在保存时提供一个JPG格式的过滤器;反之亦然。
BOOL CBmpToXyzDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
CFileDialog fd(false);
if (m_bgif)
{
fd.m_ofn.lpstrFilter = "JPG Files(*.jpg)\0*.jpg\0\0";
fd.m_ofn.lpstrDefExt = "jpg";
fd.m_ofn.lpstrTitle = "Save as JPG";
}
else
{
fd.m_ofn.lpstrFilter = "GIF Files(*.gif)\0*.gif\0\0";
fd.m_ofn.lpstrDefExt = "gif";
fd.m_ofn.lpstrTitle = "Save as GIF";
}
if (fd.DoModal() == IDOK)
{
if (m_bgif)
OnSaveJpgDocument(fd.GetPathName());
else
OnSaveGifDocument(fd.GetPathName());
}
return TRUE;
}
在这段代码中,根据m_bgif标志的值来设置保存对话框的过滤器和默认扩展名。这样,用户在保存文件时就可以根据当前文件的格式选择不同的保存格式。
CDocument::DoSave方法的实现非常有趣。如果传入的文件路径参数为NULL,它会调用CWinApp::DoPromptFileName方法来显示“另存为”对话框。CWinApp::DoPromptFileName方法会进一步调用CDocManager::DoPromptFileName方法,最终使用CFileDialog来显示对话框。