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

2016-01-29 11:58 33 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

作者:Northtibet

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

下载源代码

  最近有位读者来信指出:《在线杂志》第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;             // 切记使用完后释放资源
详细代码请参考本文例子代码。

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

来源:http://www.tulaoshi.com/n/20160129/1484073.html

延伸阅读
1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单...
自绘对话框 作者:Alon 下载示例源代码 闲来无事,写了一个简单的对话框界面,希望给需要的朋友有所帮助。 界面如下: 界面很单调,我只是想说明一下如何实现界面的自绘。如果有需要,也可以绘制更复杂漂亮的界面。 程序的实现也不复杂,接下来就跟着我一步一步做。...
标签: PS PS教程
      横轴代表像素本身的两度,竖轴代表新调节的亮度。中间的直线代表目前输入与输出之间的关系。可以单击某个Channels,进行Curves设置,或按Shift键选择两个以上的Channels.     在图像中准备要调节亮度的地方按下鼠标,一个圆出现在Curves对话框中的直线上。拖动这个圆即可调节图...
他的代码大致如下: static TCHAR BASED_CODE szFilter[] = _T(&TXT(*.txt)|*.txt||&); CFileDialog dlg(TRUE,_T(&txt&), NULL,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT, szFilter, NULL ); INT_PTR nResult = dlg.DoModal(); 我测试了一下,选择比较多txt文件时,确实如他所言,会出现返回值是IDCANCEL的情况,但是有时如果...
不规则对话框的又一实现 作者:河北唐山 吕建欣 下载本文示例代码 代码运行效果图如下: 此不规则对话框的实现应用了一个重要的位图对话框类——CBitmapDialog ,通过灵活运用,可以实现任意形状的对话框。 一、CBitmapDialog ...

经验教程

112

收藏

89
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部