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