关于CFileDialog使用OFN_ALLOWMULTISELECT时遇到的问题

杀时间 2006-01-08 10:34:37
在打开文件对话框中全选时iResult总是返回2,看msdn说可能是nMaxFile需要设置,不知道怎么改请高手指教。谢谢!
代码如下:
CFileDialog fDlg(TRUE);
fDlg.m_ofn.lpstrTitle = "Select image file";
fDlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;
static char BASED_CODE szFilter[] = "BMP (*.bmp)\0*.bmp\0JPEG (*.jpg;*.jpeg)\0*.jpg; *.jpeg\0ICON (*.ico)\0*.ico\0GIF (*.gif)\0*.gif\0Exif (*.exif)\0*.exif\0PNG (*.png)\0*.png\0TIFF (*.tiff)\0*.tiff\0WMF (*.wmf)\0*.wmf\0EMF (*.emf)\0*.emf\0All support format\0*.bmp; *.jpg; *.jpeg; *.ico; *.gif; *.exif; *.png, *.tiff; *.wmf; *.emf\0All Files (*.*)\0*.*\0\0";
fDlg.m_ofn.lpstrFilter = szFilter;
fDlg.m_ofn.nFilterIndex = 10;
int iResult = fDlg.DoModal();
if (IDOK == iResult)
{
POSITION pos;
pos = fDlg.GetStartPosition();
while(pos != NULL)
{
CString strFile;
strFile = fDlg.GetNextPathName(pos);
do something ...
}
}
...全文
873 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cici2006 2006-01-09
  • 打赏
  • 举报
回复
楼上都是好人喔。
lewition 2006-01-09
  • 打赏
  • 举报
回复
偶Copy自己的项目代码给楼主作参考,记得偶得好噢~~~~~~~

void CGeoAnView::OnLayerAddin()
{
// TODO: Add your command handler code here
char szFilter[]="Shape文件(*.shp)|*.shp|所有文件(*.*)|*.*||";
CFileDialog dlg(TRUE,"shp", _T("*.shp"),
OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,
szFilter,this);
CString strFileNames;
dlg.m_ofn.lpstrFile=strFileNames.GetBuffer(2048);
dlg.m_ofn.nMaxFile=2048;
if(dlg.DoModal()==IDOK)
{
POSITION pos = dlg.GetStartPosition();
while (pos)
{
CString strFilePath=dlg.GetNextPathName(pos);
// find file path name yes or no in the list
//
m_MoProject.AddLayer(strFilePath);
}
RefreshLayerDlg();
RefreshSearchDlg();
}
}
Kudeet 2006-01-09
  • 打赏
  • 举报
回复
搂主的代码是在全部选择的时候出问题,所以只测试代码可能在不同的电脑上目录下的文件个数不同影响的吧
Kudeet 2006-01-09
  • 打赏
  • 举报
回复
使用CFileDialog类并设置OFN_ALLOWMULTISELECT标志时,OPENFILENAME结构体的lpstrFile成员是一个指向用户申请分配的缓冲区,里面接受所选的路径和文件名列表,这个列表的每一项由一个NULL隔开,最末以两个NULL结束。nMaxFile成员指明了缓冲区的大小,如果所选择的文件名的加起来的总长度超过了此值,则DoModal函数返回IDCANCEL,如果用户试图打开超过缓冲区大小的文件集的话,CommDlgExtendedError()将返回FNERR_BUFFERTOOSMALL,这时候,lpstrFile的前两个byte将会包含实际需要的缓冲区的字节数。

如果是在Windows NT 4.0下,能被拷贝到lpstrFile缓冲区的字节数被限制在2562字节以内,如果超过将被截断。

以下是一个使用该类进行多文件名选择的例子,希望能对您有所帮助。

#include "cderr.h" //for definition of FNERR_BUFFERTOOSMALL

CFileDialog dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL );
DWORD MAXFILE = 4000
dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = NULL;

int iReturn = dlg.DoModal();
if(iReturn == IDOK)
{
int nCount = 0;
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
{
dlg.GetNextPathName(pos);
nCount++;
}
CString str;
str.Format("Successfully opened %d files\n", nCount);
AfxMessageBox(str);
}
else if(iReturn == IDCANCEL)
AfxMessageBox("Cancel");

if(CommDlgExtendedError() == FNERR_BUFFERTOOSMALL)
AfxMessageBox("BUFFERTOOSMALL");
delete []pc;


如果需要进一步的信息,您可以参看:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_cfiledialog.asp以及Q179372等有关信息。
handsomerun 2006-01-08
  • 打赏
  • 举报
回复
代码试过了
再偶这一点问题都没有…………
不知是该高兴还是郁闷…………

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧