关于 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,一经查实,立即删除!

相关文章

React开发(217):vs code出现‘npm’

npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。 所在位置 行:1 字符: 1 解决 以管理员身份打开vs code

java类内存中只能运行一个实例对象

方法:构造方法私有化(private) public class TestClass { private static TestClass obj new TestClass (); //私有构造方法   private TestClass () {        }   public static TestClass getInstance() {     return obj ;   } } 使用&#xff…

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是一款流行的压缩工具,它支持鼠标播放及外壳扩展功能,支…

JAVASCRIPT 提示信息 主要是使用了获取控件的位置进行定位

JAVASCRIPT 提示信息 主要是使用了获取控件的位置进行定位 <% Page Language"C#" AutoEventWireup"true" CodeBehind"DCS_SubmitNewRequest.aspx.cs" Inherits"BAF.DCS.Web.DCS_SubmitNewRequest" %> <!DOCTYPE html PUBL…

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

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

同时打开多个VC工程

操作流程如下&#xff1a; 在系统资源管理器->文件夹选项->选择dsw文件-> 高级->open with->编辑->把“使用DDE”前面的勾取消 点击确定&#xff0c;OK。已经设置OK.

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

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

MS SQLService中的*= 及 =*

今天看到数据库中的存储过程中&#xff0c;有* &#xff0c;于是百度了一下&#xff0c;原来这个SQL2000以前的左连接&#xff0c;以后的版本中开启兼容也是可以用的。 于是拿出来在系统中的表中测试了一下果然如此 例&#xff1a; 有用户表D_user及公司代码表d_organization 其…

Oracle 外部表

-- -- Oracle 外部表 -- 外部表只能在Oracle 9i 之后来使用。简单地说&#xff0c;外部表&#xff0c;是指不存在于数据库中的表。通过向Oracle提供描述外部表的元数据&#xff0c;我们 可以把一个操作系统文件当成一个只读的数据库表&#xff0c;就像这些数据存储在一个普通数…

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

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

(C++)浅谈using namespace std

1、<iostream>和<iostream.h> 在你的编译器include文件夹里面可以看到&#xff0c;二者是两个文件&#xff0c;里面的代码是不一样的。 后缀为.h的头文件c标准已经明确提出不支持了&#xff0c;早些的实现将标准库功能定义在全局空间里&#xff0c;声明在带.h后缀的…

lpr命令linux下未找到,linux – LPR命令无法识别CUPS打印机

我有一个杯子服务器,上面配置了一台共享打印机.它可以毫无问题地打印测试页.printername (Idle, Accepting Jobs, Shared)Description: descLocation:Driver: Zebra ZPL Label Printer (grayscale, 2-sided printing)Connection: socket://172.20.50.26Defaults: job-sheetsnon…

Qt如何将数据保存成CSV文件

一、csv文件 csv文件是逗号分隔值&#xff08;Comma-Separated Values&#xff0c;CSV&#xff09;文件的缩写&#xff0c;其文件以纯文本形式存储表格数据&#xff08;数字和文本&#xff09;&#xff0c;各个字段用逗号进行分割&#xff0c;采用回车进行换行。由于采用纯文本…

windows 2003负载均衡故障切换

准备一个vip realserver 1 realserver 2 server1&#xff1a; IP:192.168.1.3 掩码:255.255.255.0 网关:192.168.1.254 server2: IP:192.168.1.4 掩码:255.255.255.0 网关:192.168.1.254   在server1上通过NLB管理器建立集群: 虚拟IP:192.168.1.111 掩码:255.255.255.0 网关:…

SecureCRT日志配置

SecureCRT设置 日志文件名&#xff1a; D:\Embedded\SecureCRT\SessionLog\%S__%Y-%M-%D_%h%m.log 连接时&#xff1a; [%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等等&#xff0c;都属于服务。chkconfig工具&#xff0c;在centos6和之前的…

linux0.11文件分析

在kernel包中有几个重要的文件夹和文件&#xff0c;他们各司其职&#xff0c;处理着有关内核的一些功能操作。其中文件夹有三个&#xff1a;blk_drv(块设备驱动)&#xff0c;chr_drv(字符设备驱动)&#xff0c;math(数学协处理器) 文件中asm.s fork.c mktime.c panic.c p…