【问题标题】:Handle multiple file selection处理多个文件选择
【发布时间】:2014-05-28 14:01:50
【问题描述】:

我有以下代码:

void OpenJpgFile(HWND hWnd)
{
OPENFILENAME ofn;
wchar_t szFileName[17*MAX_PATH] = L"";

ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrTitle = L"Selecione as fotos que deseja adicionar...";
ofn.lpstrFilter = L"Arquivos JPEG (*.jpg)\0*.jpg\0Todos os Arquivos (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT;
ofn.lpstrDefExt = L"jpg";
if(GetOpenFileName(&ofn))
{
            //Test
    MessageBox(hWnd,ofn.lpstrFileTitle,L"TESTE",NULL);


            if(gpBitmap)
    {
        delete gpBitmap;
    }
    gpBitmap = new Bitmap(szFileName);

        InvalidateRect(hWnd, NULL, TRUE);
        UpdateWindow(hWnd);
    }
}

我想知道的是如何获取用户选择的所有文件的名称...

我能得到的只是文件夹的路径……有没有保存文件名的数组?

【问题讨论】:

  • 你试过reading the documentation吗?
  • 这是 XP 文件对话框的主要痛点。您必须预先决定为文件名分配多大的缓冲区。如果用户选择了太多文件,您的程序将无法获取所有名称。这就是为什么您必须切换到 Vista 文件对话框,IFileDialog

标签: c++ winapi


【解决方案1】:

根据documentation of OFN_ALLOWMULTISELECT,当同时指定OFN_EXPLORER 时,lpstrFile 将包含文件名后跟的目录,以空字符分隔,并以两个相邻的空字符结束。当您调用 new Bitmap(szFileName) 时,您正在错误地对待 szFileName - 也就是说,您将它传递给一个需要标准单空终止字符串的构造函数。相反,您必须更仔细地处理它以读取初始空值,并可能重新创建完整的文件路径。

这种字符串格式恰好与 REG_MULTI_SZ 使用的格式相同,因此,除了不必担心缺少最终终止符之外,与处理 REG_MULTI_SZ 类型的值相关的建议可以在这里为您提供帮助。

请注意,要完全通用,您可能还必须处理需要更大缓冲区的情况。其他角度见GetOpenFileName() with OFN_ALLOWMULTISELECT flag set

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多