分类: C/C++
2008-04-23 22:00:51
关于 CFileDialog 对话框多选功能的一个问题
作者:
最近有位读者来信指出:中有一篇文章:“再谈
CFileDialog 对话框的定制”,其例子程序有一个bug。如果多选时选中的文件过多,那么后面选中的文件将无效,也就是说即使也白选,点击“确定”后没有任何操作
。本文将提供解决此问题的办法,并说明问题的来由。
一般我们都是象下面这样来设置具备多选能力的 CFileDialog:
// 首先创建一个 CFIleDialog 类实例,并设置多选标志 1 CFileDialog mFileDlg(TRUE, NULL,NULL, 2 OFN_ALLOWMULTISELECT, 3 _T("Text Files (*.txt)|*.txt|All Files (*.*)|*.*||"), 4 AfxGetMainWnd()); 5 CString pathName; 6 If(mFileDlg.DoModal ()==IDOK) 7 { 8 POSITION mPos=mFileDlg.GetStartPosition(); 9 while(mPos!=NULL) 10 { 11 pathName=mFileDlg.GetNextPathName(mPos); 12 TRACE("%s\n",pathName); 13 } 14 } 15 else 16 TRACE(“IDCANCLE\n”);在大多数情况下,这段代码都能正常运行,但如果你选中的文件过多,那么后面选中的文件将不会被影响,选中无反应,点击“确定”也无操作。这是为什么呢?在上述代码段的第五行添加如下语句:
TRACE("nMaxFile :%d\n",mFileDlg.m_ofn.nMaxFile);编译并运行上述代码(具体细节参见本文例子程序),并用 TraceWin 跟踪 TRACE 输出,你会发现 nMaxFile 的输出是 260。如图所示:
#define NAMEBUF 1024 ... mFileDlg.m_ofn.lpstrFile=new TCHAR[NAMEBUF]; // 重新定义 lpstrFile 缓冲大小 memset(mFileDlg.m_ofn.lpstrFile,0,NAMEBUF); // 初始化定义的缓冲 mFileDlg.m_ofn.nMaxFile = NAMEBUF; // 重定义 nMaxFile ... delete [] mFileDlg.m_ofn.lpstrFile; // 切记使用完后释放资源详细代码请参考本文例子代码。