处理多个文件选择

时间:2014-05-28 14:01:51

标签: c++ winapi

我有以下代码:

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);
    }
}

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

我能得到的只是文件夹的路径......是否有一个保存文件名的数组?

1 个答案:

答案 0 :(得分:2)

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

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

请注意,要完全通用,您可能还需要处理需要更大缓冲区的情况。有关该

的另一个角度,请参阅GetOpenFileName() with OFN_ALLOWMULTISELECT flag set