正文

转CFileDialog的扩展名问题   2007-09-19 10:48:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sword2008/29520.html

分享到:

使用MFCCFileDialog类保存文件时,遇到了一个小小的问题,当我在文件名栏中写入带扩展名的名字时,CFileDialog不判断该扩展名是否符合我的要求。比如我规定的扩展名是.vvt。当输入a.bmp时我预期想得到的文件名应该是a.bmp.vvt。但是系统依然给我返回a.bmp.vvt。(word实现了这个功能,大家可以实验一下,咳咳)

怎么办?

我在点击OK的时候修改了不就完了。于是乎,baidugoogleMSDN。。。。+实验实验。最后搞定了,办法如下:

重载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.         为什么在UNICODEstrFileName.GetLength()要乘2?为什么还要加一个数?

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1765520

阅读(5117) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册