如何从本机Win32应用程序中选择现有文件夹(或创建新文件夹)?
这是一个类似的问题.它对C#/ .NET有很好的答案.但是我希望原生Win32能做同样的事情.
有人知道解决方案,免费代码等吗?
更新:
我从答案中尝试了这个功能.除了必须调用SHGetPathFromIDList
函数来检索所选目录的名称之外,所有内容都按预期工作.这是一个示例屏幕截图:
pet*_*hen 19
帮助您的用户,并至少设置BIF_NEWDIALOGSTYLE
标志.
要设置初始文件夹,请添加以下代码:
static int CALLBACK BrowseFolderCallback(
HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED) {
LPCTSTR path = reinterpret_cast<LPCTSTR>(lpData);
::SendMessage(hwnd, BFFM_SETSELECTION, true, (LPARAM) path);
}
return 0;
}
// ...
BROWSEINFO binf = { 0 };
...
binf.lParam = reinterpret_cast<LPARAM>(initial_path_as_lpctstr);
binf.lpfn = BrowseFolderCallback;
...
Run Code Online (Sandbox Code Playgroud)
并提供合适的路径(例如记住最后的选择,您的应用程序数据文件夹或类似的)
Spa*_*son 12
对于未来的用户来说,这篇文章对于在C++中获取目录对话框帮了我很多忙
http://www.codeproject.com/Articles/2604/Browse-Folder-dialog-search-folder-and-all-sub-fol
这是我的代码(基于/严重/文章)
注意:您应该能够将其复制/粘贴到文件中/编译它(g ++,请参阅下面的ninja编辑中的VS)并且它将起作用.
#include <windows.h>
#include <string>
#include <shlobj.h>
#include <iostream>
#include <sstream>
static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if(uMsg == BFFM_INITIALIZED)
{
std::string tmp = (const char *) lpData;
std::cout << "path: " << tmp << std::endl;
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
}
return 0;
}
std::string BrowseFolder(std::string saved_path)
{
TCHAR path[MAX_PATH];
const char * path_param = saved_path.c_str();
BROWSEINFO bi = { 0 };
bi.lpszTitle = ("Browse for folder...");
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM) path_param;
LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
if ( pidl != 0 )
{
//get the name of the folder and put it in path
SHGetPathFromIDList ( pidl, path );
//free memory used
IMalloc * imalloc = 0;
if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
{
imalloc->Free ( pidl );
imalloc->Release ( );
}
return path;
}
return "";
}
int main(int argc, const char *argv[])
{
std::string path = BrowseFolder(argv[1]);
std::cout << path << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我已更新代码,以向人们展示如何记住上次选择的路径并使用它.
另外,对于VS,使用Unicode字符集.替换这一行:
const char * path_param = saved_path.c_str();
Run Code Online (Sandbox Code Playgroud)
有了这个:
std::wstring wsaved_path(saved_path.begin(),saved_path.end());
const wchar_t * path_param = wsaved_path.c_str();
Run Code Online (Sandbox Code Playgroud)
上面的我的测试代码是用g ++编译的,但这样做会在我的VS中修复它.
对于 Windows Vista 及更高版本,最好IFileOpenDialog
与FOS_PICKFOLDERS
正确打开对话框的选项一起使用,而不是使用此树形对话框。有关更多详细信息,请参阅MSDN 上的公共项目对话框。
归档时间: |
|
查看次数: |
29031 次 |
最近记录: |