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

From: http://www.vckbase.com/document/viewdoc/?id=1544

最近有位读者来信指出:《在线杂志》第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("%s\n",pathName);
13	} 
14     }
15     else
16         TRACE(“IDCANCLE\n”);
  在大多数情况下,这段代码都能正常运行,但如果你选中的文件过多,那么后面选中的文件将不会被影响,选中无反应,点击“确定”也无操作。这是为什么呢?在上述代码段的第五行添加如下语句:
	TRACE("nMaxFile :%d\n",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.mzph.cn/news/405709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux winrar 安装目录,WinRAR 5.61发布,提供Linux版本下载,附安装方法

压缩及解压缩工具WinRAR 5.61已经发布下载,提供WinRAR (32/64 bit) 5.61、RAR 5.61 for Linux、RAR for Android、RAR 5.61 for Mac OS X、RAR 5.61 for FreeBSD安装包下载。WinRAR 5.61是一款流行的压缩工具,它支持鼠标播放及外壳扩展功能,支…

luceda ipkiss教程 53:在版图上加中文

要在版图上加中文,如: 可以通过如下方法实现: 首先,可以在ppt中加入文本框,在文本框中输入想要加到版图上的中文内容,如,复旦大学,并将文本框存为windows位图。 其次,通…

QtCreator 如何将开发的程序打包成exe

一、前言 在QtCreator中开发好应用程序后,想发布成exe可执行程序,在其他电脑可以运行,按照以下步骤即可。QtCreator在安装的时候会自带部署器windeployqt,利用windeployqt抽出相应的DLL即可。 二、具体步骤 1:将开发…

LED32*32点阵书写屏设计方案

一、引言 目前LED显示屏都是采用字模软件生成好的字节序列然后进行显示,而LED点阵书写屏是一种无需通过字模软件编码即可给LED显示屏提供显示信息的一种新的交互方案,通过光敏二极管或光敏三极管在屏幕上捕获LED点阵的驱动信号,从而反馈至控制…

SecureCRT日志配置

SecureCRT设置 日志文件名: D:\Embedded\SecureCRT\SessionLog\%S__%Y-%M-%D_%h%m.log 连接时: [%Y%M%D %h:%m:%s] 在每行: [%h:%m:%s]

linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig

chkconfig --listchkconfig --level 3 network offchkconfig --level 345 network offchkconfig --del networkchkconfig --add networkchkconfig工具crond、iptables、firewalld、nginx、httpd、mysql等等,都属于服务。chkconfig工具,在centos6和之前的…

Exchange2003-2010迁移系列之二,迁移前的准备工作(上)

Exchange2010迁移前的准备工作(上) 上篇博文发出后,很多博友支持得非常给力,在此一并谢过!也有一些博友反映看得不是很明白,但仍然支持…..本文中首先就环境问题再为大家解释一下,然后介绍如何进…

BMP图像文件格式分析附带图解

From: http://www.raidcn.com/js/BMPTuXiangWenJianGeShiFenXiFuDaiTuJie.html 认识BMP文件格式,以及bmp文件存储结构 ,通过winhex查看文件结构解析。 一、认识BMP文件格式. 1、 BMP格式是由微软公司开发。通常BMP图像文件的后缀名是BMP,但…

matlab安装MinGW-64代码C/C++编译器的方法

一、说明 matlab中编写的m文件转成C/C代码,以及matlab中执行C/C带啊,需要用到mex 查看matlab是否支持可以输入mex -setup: 二、安装 如果不支持,没找到,则需要重新安装,下载地址:http://tdm-…

mybatis+spring+c3p0+maven+ehcache

项目截图 pom.xml如下 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">…

windbg linux内核调试,windbg调试虚拟机XP系统

一、先介绍一下被调试的虚拟机系统环境:虚拟机:vmware workstation 10.0版本虚拟机操作系统: Microsoft windows xp professional 2002 service pack3cpu:2.8GHz,2.64GB内存二、这个没有直接关系。做个笔记而已。1.在XP系统中&#xff0c;创建了一个first.c文件测试代码如下:#i…

C#反射技术在多语言实现中的实际用处参考,让初学者学技术有个针对性【附源码】...

做软件&#xff0c;有点儿类似铁人三项比赛&#xff1f;赛跑、射击、游泳? 光某个环节突出&#xff0c;也没多大用&#xff0c;需要整体能力都强&#xff0c;能把整体都可以搞定&#xff0c;才容易得到比赛的胜利&#xff0c;光某一环节非常优秀&#xff0c;也赢得不来整个比…

华为网卡支持linux,在openwrt下对华为WA633无线AP的千兆网卡驱动进行支持

1.下面是这款AP的全裸图&#xff0c;AP的无线网卡采用了AR9223&#xff0c;PHY采用了博通的BCM5461&#xff0c;主控CPU位octeon 500&#xff0c;射频功放采用的是RF5602方案。由于这款CPU并不常见&#xff0c;我至今未在网上找到它的datasheet&#xff0c;导致我们在玩这款AP的…

linux 正则表达式 视频教程,30分钟带你玩转正则表达式

定义&#xff1a;正则表达式说白了就是有普通字符、以及特殊字符组成的文子模式。{匹配模式标准}正则表达式将会作为一个模板与所搜索的字符串进行匹配。可以让使用者轻易达到搜寻/删除/取代某些特定字符的处理程序。此外vim、grep、find、awk、sed等命令都支持正则表达式注&am…

电脑SSH登陆树莓派Raspberry的两种方式

采用SSH登陆Raspberry需要提前知道Raspberry的IP&#xff0c;SSH登陆端口为22&#xff0c;这里分享两种基于SSH网络登陆树莓派的方式。 一、利用路由器搭建局域网登陆树莓派 1、用路由器搭建局域网&#xff0c;电脑无线或有线方式连接路由器&#xff0c;树莓派用网线连接路由…

Linux sed工具用法

一、sed用法 语法&#xff1a; sed [-nefr] [动作] 作用&#xff1a; 以行为单位的新增/删除/修改/插入/替换等功能&#xff0c;bash脚本中常用。sed功能强大&#xff0c;主要体现在[动作]的指定 选项与参数&#xff1a; -n &#xff1a;只有经过 sed 特殊处理的那一行&…

SourceInsight配置

如图&#xff1a; 1&#xff09; SourceInsight: a) 搜索结果直接替换 b) 配置背景色 c) 显示行号、设置tab键宽度为4个空格以及其他 d) 字体设置 e) 不创建备份文件