关于 CFileDialog 对话框多选功能的一个问题

junjun3119

junjun3119

2016-01-29 11:58

关于 CFileDialog 对话框多选功能的一个问题,关于 CFileDialog 对话框多选功能的一个问题

关于 CFileDialog 对话框多选功能的一个问题

作者:Northtibet

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

  最近有位读者来信指出:《在线杂志》第26期中有一篇文章:“再谈 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("%sn",pathName);13} 14     }15     else16         TRACE(“IDCANCLEn”);
  在大多数情况下,这段代码都能正常运行,但如果你选中的文件过多,那么后面选中的文件将不会被影响,选中无反应,点击“确定”也无操作。这是为什么呢?在上述代码段的第五行添加如下语句:
TRACE("nMaxFile :%dn",mFileDlg.m_ofn.nMaxFile);
  编译并运行上述代码(具体细节参见本文例子程序),并用 TraceWin 跟踪 TRACE 输出,你会发现 nMaxFile 的输出是 260。如图所示:



  问题就出在这里,nMaxFile 是 OPENFILENAME 结构的成员之一,MSDN 对之是这样解释的:
nMaxFile:说明 lpstrFile 缓冲指针的大小,以 TCHARs 为单位。对于 ANSI 版本,它指的是字节数。对于 Unicode 版本,它指的是字符数,该缓冲必须足够大才能存储文件的路径字符串,包括结尾空字符。如果 该缓存太小以至于无法包含文件信息,那么 GetOpenFileName 和 GetSaveFileName 函数将返回 FALSE。该缓冲至少要求容纳 256 个字符。
  现在明白了吧,多选时,由于文件路径和名称的长度超过了限制,造成程序出现上述问题。解决办法是重新设置 nMaxFile 大小。
#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;             // 切记使用完后释放资源
详细代码请参考本文例子代码。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

展开更多 50%)
分享

猜你喜欢

关于 CFileDialog 对话框多选功能的一个问题

C语言教程 C语言函数
关于 CFileDialog 对话框多选功能的一个问题

一个定制CFileDialog对话框的实例

C语言教程 C语言函数
一个定制CFileDialog对话框的实例

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

CFileDialog的钩子函数解决对话框的多选之DoModal问题

编程语言 网络编程
CFileDialog的钩子函数解决对话框的多选之DoModal问题

再谈 CFileDialog 对话框的定制

C语言教程 C语言函数
再谈 CFileDialog 对话框的定制

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

关于对话框

编程语言 网络编程
关于对话框

一个简单的登录对话框的实现

C语言教程 C语言函数
一个简单的登录对话框的实现

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

HTML之链接标记

HTML之链接标记

将CAD图纸转换为SolidWorks三维模型详解

将CAD图纸转换为SolidWorks三维模型详解
下拉加载更多内容 ↓