怎么自定义MFC程序的保存文件名称?

来源:互联网 发布:js 精度丢失 知乎 编辑:程序博客网 时间:2024/05/01 07:53

(转自:http://wenwen.soso.com/z/q274419303.htm)

用MFC的默认创建的单文档程序,菜单栏里的“文件->保存(或打开)”里的类型都是“所有文件(*.*)”,怎么样才能自定义文件后缀名呢?

在你创建单文档程序的第四步,哪里不是有个advanced选项吗。单击它,然后再如图所示输入文件的后缀名,如txt,然后点Finish,效果如图,还有一种方法就是打开你的资源视图,点击字符串表,哪里不是有个ID为IDR_MAINFRAME,默认是Test\n\nTest\n\n\nTest.Document\nTest Document(注:Test是你输入的工程名),你可以在第三个\n后面输入,显示在保存类型的内容,在第四个\n后面输入过滤符,如.txt。

至于通过代码修改的,我想不起来了,应该在CDocument类中吧,去查查MSDN吧,。

追问:
啊,我已经把整个程序都写好了,重新写太麻烦了,有其他改动办法么
回答:

打开你的资源视图,点击字符串表,哪里不是有个ID为IDR_MAINFRAME,默认是Test\n\nTest\n\n\nTest.Document\nTest Document(注:Test是你输入的工程名),dd\nguigui\ntxt\n.txt\n.txt\nMDI.Document\nMDI 跟着这个格式改,就可以了,没办法用代码实现。因为消息响应函数OnFileOpen中定义的文件对话框是局部对象。它是用IDR_MAINFRAME标示的字符串资源去填充CFileDialog的构造函数。根本无法获取到指针,看了半天的源代码,,晕啊、。

补充:

忘记给你把源代码发出来了,OnFileOpen是消息响应函数,响应你打开文件对话框的,保存对话框也一样的道理。下面是MFC的源代码。仔细看我加黑的那些代码调用,

afx_msg void OnFileOpen();//这里是响应函数的申明,

void CWinApp::OnFileOpen()
{
 ASSERT(m_pDocManager != NULL);
 m_pDocManager->OnFileOpen();
}你只看调用关系。这里调用文档类的OnFileOpen();

void CDocManager::OnFileOpen()//文档类的OnFileOpen
{
 // prompt the user (with all document templates)
 CString newName;
 if (!DoPromptFileName(newName, AFX_IDS_OPENFILE,
   OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TRUE, NULL))
  return; // open cancelled

 AfxGetApp()->OpenDocumentFile(newName);
  // if returns NULL, the user has already been alerted
}

//文档类里面只看它调用的DoPromptFileName方法,代码如下。

BOOL CDocManager::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
{
 CFileDialog dlgFile(bOpenFileDialog);//仔细看这里

 CString title;
 VERIFY(title.LoadString(nIDSTitle));//这里加载字符串资源哦。。仔细看。

 dlgFile.m_ofn.Flags |= lFlags;

 CString strFilter;
 CString strDefault;
 if (pTemplate != NULL)
 {
  ASSERT_VALID(pTemplate);
  _AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate, &strDefault);
 }
 else
 {
  // do for all doc template
  POSITION pos = m_templateList.GetHeadPosition();
  BOOL bFirst = TRUE;
  while (pos != NULL)
  {
   CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);
   _AfxAppendFilterSuffix(strFilter, dlgFile.m_ofn, pTemplate,
    bFirst ? &strDefault : NULL);
   bFirst = FALSE;
  }
 }

 // append the "*.*" all files filter
 CString allFilter;
 VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
 strFilter += allFilter;
 strFilter += (TCHAR)'\0';   // next string please
 strFilter += _T("*.*");
 strFilter += (TCHAR)'\0';   // last string
 dlgFile.m_ofn.nMaxCustFilter++;

 dlgFile.m_ofn.lpstrFilter = strFilter;
 dlgFile.m_ofn.lpstrTitle = title;
 dlgFile.m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);

 int nResult = dlgFile.DoModal();
 fileName.ReleaseBuffer();
 return nResult == IDOK;
}

在上面看见了CFileDialog吗,程序员一般会,会心的一笑,因此证明,要改文件对话,只能通过资源,IDR_MAINFRAME改动。