同上,可以利用SHBrowseForFolder,但是需要先准备一些数据。
我原来写过一个封装起来的函数GetWin32PathName,可以参考一下。
其中加了一个回调函数,可以用来设置初始路径和提示文字的。
typedef struct tagGetWin32PathExInfo
{
LPCTSTR lpszInitialDir;
LPCTSTR lpszStatusText;
} GETWIN32PATHEXINFO;
static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
lParam;
if (uMsg == BFFM_INITIALIZED)
{
GETWIN32PATHEXINFO* pGetWin32PathExInfo = (GETWIN32PATHEXINFO*)lpData;
SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(pGetWin32PathExInfo-> lpszInitialDir));
SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)(pGetWin32PathExInfo-> lpszStatusText));
}
return 0;
}
BOOL GetWin32PathName(LPTSTR strPathName, LPCTSTR strInitialDir, LPCTSTR strTitle, HWND hwndParent)
{
LPMALLOC pMalloc;
/* Gets the Shell 's default allocator */
if (::SHGetMalloc(&pMalloc) == NOERROR)
{
BROWSEINFO bi;
LPITEMIDLIST pidl;
GETWIN32PATHEXINFO gw32PathExInfo;
if (strInitialDir == NULL)
gw32PathExInfo.lpszInitialDir = " ";
else
gw32PathExInfo.lpszInitialDir = strInitialDir;
gw32PathExInfo.lpszStatusText = strTitle;
// Get help on BROWSEINFO struct - it 's got all the bit settings.
bi.hwndOwner = hwndParent;
bi.pidlRoot = NULL;
bi.pszDisplayName = strPathName;
bi.lpszTitle = strTitle;
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowseCallbackProc;
bi.lParam = (LPARAM)&gw32PathExInfo;
// This next call issues the dialog box.
if ((pidl = ::SHBrowseForFolder(&bi)) != NULL)
{
if (::SHGetPathFromIDList(pidl, strPathName))
{
// At this point strPathName contains the selected path */
pMalloc-> Free(pidl);
pMalloc-> Release();
return TRUE;
}
// Free the PIDL allocated by SHBrowseForFolder.
pMalloc-> Free(pidl);
}
// Release the shell 's allocator.
pMalloc-> Release();
}
return FALSE;
}
怎样让CFileDialog打开的对话框只显示并返回目录
最新推荐文章于 2021-09-02 14:17:22 发布