使用MFC的CFileDialog类保存文件时,遇到了一个小小的问题,当我在文件名栏中写入带扩展名的名字时,CFileDialog不判断该扩展名是否符合我的要求。比如我规定的扩展名是.vvt。当输入a.bmp时我预期想得到的文件名应该是a.bmp.vvt。但是系统依然给我返回a.bmp.vvt。(word实现了这个功能,大家可以实验一下,咳咳) 怎么办? 我在点击OK的时候修改了不就完了。于是乎,baidu,google,MSDN。。。。+实验实验。最后搞定了,办法如下: 重载OnFileNameOK() BOOL CMyFileDlg::OnFileNameOK() { …… //如果扩展名不是我想要的进行以下修改 //修改窗口显示 CString str; CComboBox *pcmb13=(CComboBox *)GetParent()->GetDlgItem(cmb13); pcmb13->GetWindowText(str); str+=_T(".vvt"); pcmb13->SetWindowText(str); pcmb13->RedrawWindow(); //修改路径值 CString strPathNmae=GetPathName(); strPathNmae +=_T(".vtf"); #ifdef _UNICODE memcpy((void*)this->m_ofn.lpstrFile, strPathNmae.GetBuffer(0), strPathNmae.GetLength()*2+2); #else memcpy((void*)this->m_ofn.lpstrFile, strPathNmae.GetBuffer(0), strPathNmae.GetLength()+1); #endif //修改文件名 CString strFileName=GetFileName(); strFileName +=_T(".vtf"); #ifdef _UNICODE memcpy((void*)this->m_ofn.lpstrFileTitle, strFileName.GetBuffer(0), strFileName.GetLength()*2+2); #else memcpy((void*)this->m_ofn.lpstrFileTitle, strFileName.GetBuffer(0), strFileName.GetLength()+1); #endif //等待,不等待也可以,就是动作太快人眼看不到 Sleep(50); //判断文件是否存在,这时系统可就不判断文件是否存在了,需要自己动手丰衣足食了 //************ //需要#include <io.h> //************ if((_taccess(strFileName ,0) == 0)) {//存在,-1不存在。// //存在当然要提示是否覆盖了!!怎么处理就看你想怎么办了 …… } return CFileDialog::OnFileNameOK(); } 如果文件类型列表框中有多个,但我还想在初始化的时候选择最后一个(比如*.*,系统默认选择第一个类型项)。 办法:在DoModal()之前写上一句 m_FileDlg.GetOFN().nFileterIndex=4;//4是*.*在列表中的位置,第一行为1 !@##¥……点OK搞定了,慢!我又想知道你到底最后选定那一行呢?有人说了“看最后的扩展名不就得了”,老兄如果两个扩展名相同类型不同呢,比如保存不同压缩比的图像文件时,同样都是.JPEG,但压缩比不同,这时只凭扩展名就得不到了。------> 不罗嗦了,办法:还是m_FileDlg.GetOFN().nFileterIndex,在DoModal()之后就是你选的行号! 看着不错,还算好用,不过留点作业吧(很有用的知识哦),自己动手丰衣足食。 1. cmb13是什么? 2. 为什么要进行RedrawWindow()操作? 3. 为什么在UNICODE时strFileName.GetLength()要乘2?为什么还要加一个数? Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1765520

评论