//
//.h
class CBrowseDirDialog
{
public:
CBrowseDirDialog();
virtual ~CBrowseDirDialog();
int DoBrowse();
CString GetPath();
CString GetSelDir();
protected:
CString m_Path; //存放返回的路径信息
CString m_InitDir; //初始显示的路径名,默认为桌面
CString m_SelDir; //打开对话框后,默认选中的目录名,缺省为根目录
CString m_Title; //设置对话框中浏览信息的标题,默认为"打开"
int m_ImageIndex;
};
//
//.cpp
#include "stdafx.h"
#include "BrowserDirDlg.h"
#include "shlobj.h"
//SHBrowseForFolder控件在初始化或选择改变后的回调函数
static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
CBrowseDirDialog* pBrowseDirDialogObj = (CBrowseDirDialog*)lpData;
if (uMsg == BFFM_INITIALIZED
&& !pBrowseDirDialogObj->GetSelDir().IsEmpty())
{
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)(pBrowseDirDialogObj->GetSelDir()));
}
else // uMsg == BFFM_SELCHANGED
{
}
return 0;
}
//构造函数
CBrowseDirDialog::CBrowseDirDialog()
{
}
//析构函数
CBrowseDirDialog::~CBrowseDirDialog()
{
}
int CBrowseDirDialog::DoBrowse()
{
LPMALLOC pMalloc;
if (SHGetMalloc (&pMalloc)!= NOERROR)
{
return 0;
}
BROWSEINFO bInfo;
LPITEMIDLIST pidl;
ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));
if (!m_InitDir.IsEmpty ())
{
OLECHAR olePath[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
HRESULT hr;
LPSHELLFOLDER pDesktopFolder;
if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
{
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED, m_InitDir.GetBuffer(MAX_PATH), -1,
olePath, MAX_PATH);
m_InitDir.ReleaseBuffer (-1);
//转换路径为ITEMLIST
hr = pDesktopFolder->ParseDisplayName(NULL,NULL,olePath,&chEaten,&pidl,
&dwAttributes);
if (FAILED(hr))
{
pMalloc ->Free (pidl);
pMalloc ->Release ();
return 0;
}
bInfo.pidlRoot = pidl;
}
}
bInfo.hwndOwner = NULL;
bInfo.pszDisplayName = m_Path.GetBuffer (MAX_PATH);
bInfo.lpszTitle = (m_Title.IsEmpty()) ? "打开":m_Title;
bInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
bInfo.lpfn = BrowseCtrlCallback; //回调函数地址
bInfo.lParam = (LPARAM)this;
if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)
{
return 0;
}
m_Path.ReleaseBuffer();
m_ImageIndex = bInfo.iImage;
if (::SHGetPathFromIDList(pidl,m_Path.GetBuffer(MAX_PATH)) == FALSE)
{
pMalloc ->Free(pidl);
pMalloc ->Release();
return 0;
}
m_Path.ReleaseBuffer();
pMalloc ->Free(pidl);
pMalloc ->Release();
return 1;
}
CString CBrowseDirDialog::GetPath()
{
return m_Path;
}
CString CBrowseDirDialog::GetSelDir()
{
return m_SelDir;
}
///
需要微软sdk的支持
mfc中打开文件夹
最新推荐文章于 2021-09-09 09:34:03 发布