扩充文件选择对话框的多选能力
我们都会使用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对话框类默认存放文件名过小的问题,同时也提醒我们任何一个程序都需要进行各种模拟测试,不要简单测试正常就通过,否则,因为不同用户有不同的环境,程序发行后就会很容易产生各种问题。
历史博文
- 20080804 GUITOOLKIT 编译 static lib - 2009
- 20070709 LUA 调用 C 变量 - 2008
- 1018 pecofoods - 2007
- 0131 SIP VC2005 warning C4996 - 2006