CFileDialog _dlgFile(FALSE, _T("nce"), _GETCS(s_szNOTITLE),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,|*.nce|, AfxGetMainWnd(),0);
上述代码为另存为窗口,我设置了nce格式也就是只能保存为.nce格式的文件。
事实上我输入csdn为文件名时确实能保存为csdn.nce文件
但是当我输入csdn.txt时它确保存为csdn.txt,而没有像我想象中的保存为csdn.txt.nce(就是自己把扩展名改为电脑上已知的
扩展名时它就自动保存为那种格式了)

解决方案 »

  1.   

    CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL,
                 LPCTSTR lpszFileName = NULL,
                 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
                 LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );参数意义:  bOpenFileDialog 为TRUE则显示打开对话框,为FALSE则显示保存对话文件对话框。
      lpszDefExt 指定默认的文件扩展名。
      lpszFileName 指定默认的文件名。
      dwFlags 指明一些特定风格。 (默认OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT)
      lpszFilter 指明可供选择的文件类型和相应的扩展名。
      pParentWnd 为父窗口指针。其中,扩展名应该遵循以下格式:  “Chart Files (*.xlc)|*.xlc| Worksheet Files (*.xls)|*.xls| Data Files (*.xlc;*.xls)|*.xlc ; *.xls| All Files (*.*)|*.*||”;
      文件类型说明和扩展名间用 | 分隔,同种类型文件的扩展名间可以用 ; 分割,每种文件类型间用 | 分隔,末尾用 || 指明。
      

  2.   

    CFileDialog仅仅是获取文件路径
    GetPathName 然后自己拼接字符串才是王道
     
      

  3.   

    各位大神,我看word里面的保存就很智能.假设你保存为"csdn.txt",它会自动给你在后面加上一个.dox变成"csdn.txt.doc"。这是怎么做的呢?是字符串拼接还是?
      

  4.   

    這個功能是別人添加的,不是默認的功能.
    5樓說的才是道理.
    CFileDialog 顯示後,當用戶點了OK键后,
    你应该能获取到用户输入的文件名,然后在文件名后辍不是你要的那个,就强行增加后辍,如果是,就不管,再保存
      

  5.   

    经测试 GetSaveFileName 函数,发现:
    1. 如 ofn.lpstrFilter 指定文件通配符,如“TEXT("Microsoft Word 文档\0*.doc\0\0");”,则当文件未输入扩展名时补 .doc,如用户输入了文件名扩展名,则不会添加 .doc。这种情况下,即使 ofn.lpstrDefExt 参数指定了默认扩展名,也不会添加此扩展名。
    2. 如 ofn.lpstrFilter 未指定或者为 0 时,而 ofn.lpstrDefExt 参数指定了默认扩展名,如“TEXT("docx")”,那么无论用户是否输入了扩展名其都很会被追加。如用户输入 a 则返回 a.docx,用户输入 a.xls 则返回 a.xls.docx。但是同样发现了个奇怪现象:用户如输入 a.doc 或 a.docx 则默认扩展名不会被追加,依旧返回 a.doc 或 a.docx,我猜测 MS 只比对了前三个字母(Windows XP SP3)。
    3. 手动强制追加扩展名:对于用户输入的不是 docx 扩展名的文件,不论其是否有扩展名,强行追加 docx 扩展名。这种情况下,ofn.lpstrFilter 可指定通配符,但 ofn.lpstrDefExt 参数可以忽略不写。if (GetSaveFileName(&ofn)) {                    
        LPTSTR pszExt = PathFindExtension(szPath); 
        if (lstrcmpi(pszExt, TEXT(".docx")) != 0) {
            TCHAR szNewPath[MAX_PATH];
            wsprintf(szNewPath, TEXT("%s%s"), szPath, TEXT(".docx"));
            lstrcpy(szPath, szNewPath);
        }
        MessageBox(hwndDlg, szPath, TEXT("提示"), MB_OK);
    }此为 Windows SDK 实现方式,MFC 可参照此方法。