有时候我们需要指定单文档/多文档的“打开”或“保存”对话框的文件类型来过滤不需要的类型。我们可以重载它们,具体它们的消息默认响应可以看这里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);//一定要有这句话
}
}
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);
}
{
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
第二版。