c++ - 如何使用 winapi 创建一个对话框来选择多个文件?

标签 c++ winapi visual-c++ windows-7

如何创建具有多文件选择可能性的普通文件打开对话框?我正在使用 GetOpenFileName() 函数打开一个对话框。

如果我将 OFN_ALLOWMULTISELECT 设置为 Flags,它会给我这样的对话框:

enter image description here

出于多种原因,这不是我想要的。

我希望它看起来像这样: enter image description here

有什么简单/容易的解决方案,还是我必须自己重新创建整个对话框?

编辑:这是我打开对话框的代码:

OPENFILENAME ofn;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hWnd;
ofn.lpstrFile = "selectfile";
ofn.nMaxFile = 260;
ofn.lpstrFilter = "t1\0test1\0t2\0test2\0";
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.nFilterIndex = 1;
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
ofn.lpstrTitle = TEXT("title");
GetOpenFileName(&ofn);

最佳答案

您必须包含 OFN_EXPLORER 标志以及 OFN_ALLOWMULTISELECT 标志。

使用GetOpenFileName的缺点是您必须为所选文件分配缓冲区。因此,这意味着您需要在显示对话框之前决定缓冲区应该有多大。这会限制可选择的文件数量。

在 Vista 及更高版本中,您可以使用 common item dialog而不是 GetOpenFileName。新的公共(public)项对话框的众多改进之一是调用者不分配缓冲区。因此,可以选择的文件数量没有限制。


您的代码的一个相当严重的问题是您没有分配缓冲区。您写道:

ofn.lpstrFile = "selectfile";

它提供只读字符串文字而不是可变缓冲区。在继续之前,您需要解决该问题。此代码显示了打开支持多重选择的文件对话框所需的最低限度:

OPENFILENAME ofn = { sizeof ofn };
wchar_t file[1024];
file[0] = '\0';
ofn.lpstrFile = file;
ofn.nMaxFile = 1024;
ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER;
GetOpenFileName(&ofn);

关于c++ - 如何使用 winapi 创建一个对话框来选择多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142703/

相关文章:

visual-c++ - 为什么在 WIN8 下使用 Touch Injection API 时只能注入(inject)一次触摸?

在 C 中创建最大大小文件 : drive (OS drive) fails

winapi - WS_EX_LAYERED 色键 - Vista 问题

c++ - 我认为 do while 正在进入无限循环。或数组。 (运行时错误)

c++ - 为什么对 operator<< 的显式调用不明确?

c - 如何将ListView复选框与选择同步?(WIN32)

windows - 在 list 中指定公钥 token

visual-c++ - Visual C++ 中#import 的替换

c++ - 在 C++ 中存储带有标点符号的句子

c++ - 从内存缓冲区创建 HBITMAP