扩充文件选择对话框的多选能力

     我们都会使用VC的CfileFialog类进行文件选择操作,使用非常简单,通常代码如下:

     CFileDialog mFileDlg(TRUE, NULL,NULL, OFN_ALLOWMULTISELECT,"All Files (*.*)&line;*.*&line; &line;", AfxGetMainWnd()); //初始化一个CFIleDialog类,设置多选标志

CString pathName;

     If(mFileDlg.DoModal ()==IDOK)

     &leftsign;

     POSITION mPos=mFileDlg.GetStartPosition();

         while(mPos!=NULL)

         &leftsign;

              pathName=mFileDlg.GetNextPathName(mPos);

              TRACE("%s\\n",pathName);

     &rightsign;

     &rightsign;

     else

         TRACE(“IDCANCLE\\n”);

     以上是一段显示文件选择对话框进行多选,然后显示每个文件名的代码,我调试程序的时候似乎很正常,可以进行多选,不会出错,但是一次我不经意的进入WIN98目录,用鼠标选择了大量文件后,调试信息中显示返回是IDCANCLE,可是我明明是选择了“打开”按钮的,经过反复调试,终于解决了这个问题。

     原来,CfileDialog类有一个成员变量:m_ofn,定义为一个OPENFILENAME结构,在这个接口里,可以设置各种文件对话框的初始化信息,如果我们进行多选,那么需要重新设置其中的两个变量:

       LPTSTR        lpstrFile;   DWORD         nMaxFile;

       这两个变量就是定义为存放返回的文件名的字符串及其大小,如果我们在前面的代码中增加一行,TRACE("nMaxFile :%d\\n",mFileDlg.m_ofn.nMaxFile);查看WINDOWS默认大小,就会发现原来只能存发260个字符,所以我们必须自己重新定义字符串大小。代码如下:

       CFileDialog mFileDlg(TRUE, NULL,NULL, OFN_ALLOWMULTISELECT,"All Files (*.*)&line;*.*&line; &line;", AfxGetMainWnd());

 

         mFileDlg.m_ofn.lpstrFile=new char[2000]; //重新定义存放选择文件名称的字符串

         memset(mFileDlg.m_ofn.lpstrFile,0,2000);  //进行初始化

mFileDlg.m_ofn.nMaxFile =2000;                          //重新定义字符串大小

//2000这个数值可以根据需要进行调整,以便更好符合程序实际应用情况。

         …..

         delete mFileDlg.m_ofn.lpstrFile;         //最后手工释放资源

         由此就解决了CfileDialog对话框类默认存放文件名过小的问题,同时也提醒我们任何一个程序都需要进行各种模拟测试,不要简单测试正常就通过,否则,因为不同用户有不同的环境,程序发行后就会很容易产生各种问题。

历史博文

标签:, ,
三月 29, 2005 at 9:33 上午 by yippee 1,045 次
Category: Dev
Tags: , ,