有时候我们需要指定单文档/多文档的“打开”或“保存”对话框的文件类型来过滤不需要的类型。我们可以重载它们,具体它们的消息默认响应可以看这里MFC浅析(1) 文档视图结构中,缺省的命令处理 。
这是“打开”菜单的重载:
void CMainFrame::OnFileOpen()
{
CFileDialog dlg(
true , NULL, NULL, OFN_OVERWRITEPROMPT,
"All Files(*.*)|*.*|C/C++ Files(*.c;*.cpp;*.h;*.hpp)|*.c;*.cpp;*.h;*.hpp|C# Files(*.cs)|*.cs|Java Files(*.java)|*.java||" , NULL);
if (dlg.DoModal() == IDOK)
{
CString m_szFileName = dlg.GetPathName();
CString type = dlg.GetFileExt();
//得到文件扩展名
if (type.CompareNoCase(_T(
"exe" )) || type.CompareNoCase(_T(
"chm" )) || type.CompareNoCase(_T(
"pdf" ))|| type.CompareNoCase(_T(
"doc" )) || type.CompareNoCase(_T(
"jpg" )))
{
MessageBox(_T(
"您打开了不支持的文件类型!"),_T(" 提示信息"),MB_ICONERROR|MB_OK);
return ;
}
AfxGetApp()->OpenDocumentFile(m_szFileName);
//一定要有这句话
}
}
这是“保存”菜单的重载:
BOOL CCoolFormat2Doc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
if ( lpszPathName == NULL )
{
TCHAR szPath[MAX_PATH];
LPCTSTR pszFilter=_T(
"All Files(*.*)|*.*|C/C++ Files(*.c;*.cpp;*.h;*.hpp)|*.c;*.cpp;*.h;*.hpp|C# Files(*.cs)|*.cs|Java Files(*.java)|*.java||" );
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_EXTENSIONDIFFERENT;
CFileDialog dlg(FALSE, NULL, _T(
".txt" ), dwFlags, pszFilter, NULL);
if ( dlg.DoModal() == IDOK )
{
CString strTemp = dlg.GetPathName();
switch (dlg.m_ofn.nFilterIndex)
{
case
1 :
break ;
case
2 : strTemp += _T(
".cpp" );
break ;
case
3 : strTemp += _T(
".cs" );
break ;
case
4 : strTemp += _T(
".java" );
break ;
default :
break ;
}
lstrcpy(szPath, strTemp.GetBuffer(
0 ));
lpszPathName = szPath;
}
else
return FALSE;
}
return CDocument::DoSave(lpszPathName, bReplace);
}
具体的效果可以看CoolFormat 第二版。