怎么实现“文件夹选择”对话框,它有没有对话框类可以直接调用阿?(蔡鸟) 现在做的项目需要输入存储路径,可以自己输入或者在“文件夹选择”对话框中选择路径,怎么实现“文件夹选择”对话框啊,有没有对话框类可以直接调用阿?谢谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以用API直接写:OnButtonBrowse() { // TODO: Add your control notification handler code here BROWSEINFO bi; char path[MAX_PATH]; ITEMIDLIST* pidl; bi.hwndOwner=0; bi.pidlRoot=0; bi.lpszTitle=_T("请选择目录:"); bi.ulFlags=BIF_RETURNONLYFSDIRS; bi.lpfn=0; bi.iImage=0; if(pidl=SHBrowseForFolder(&bi)) SHGetPathFromIDList(pidl,(unsigned short*)path);//将取到的文件夹字符串放入编辑框中 CWnd* ptext=GetDlgItem(IDC_EDIT_FILEPATH); ptext->SetWindowText((const unsigned short *)path); UpdateData();} 这有篇文章描述了你所要的东西(不是我写的,我也是从这里学会的)。<在Visual C++ 6.0环境下浏览目录对话框的设计>在VC++6.0编程中,经常要用到选择目录的功能,就象在 AppWizard中选择放置工作区目录一样。在MFC中提供了类似的标准文件对话框CfileDialog类,支持用户对文件的浏览、查找等操作。用SDK函数构造这么一个对话框至少需要几百行代码,用这个类可以简单地实现和Windows标准模式一致的文件打开、另存为等功能。但在MFC中并没有提供选择目录对话框的标准类,而这在有关目录路径操作中经常用到。针对此问题,笔者设计了一个通用的浏览目录对话框的类CbrowseDirDialog,采用Windows API函数SHBrowseForFolder。用户可以采用这个类浏览任何指定的目,磁盘,并返回用户最后选择的目录信息。下面对这个类的使用作一简单介绍:在CbrowseDirDialog.h头文件中,定义了如下成员变量和函数:public:CDirDialog();virtual ~CDirDialog();int DoBrowse();CString m_Path;CString m_InitDir;CString m_SelDir;CString m_Title;int m_ImageIndex;用户可以设置对话框中浏览信息的标题在m_Title变量中,如果用户不进行设置,系统默认标题为“打开”;设置起始显示目录在m_InitDir变量中,如用户需要列出C盘下的所有目录,只需在定义的对象中设置m_InitDir=“C:\\”, 如果用户不进行设置,系统默认为整个桌面;设置每次显示的默认目录在m_SelDir变量中,如果用户不进行设置,系统默认为根目录。最后,调用DoBrowse函数,即可显示选择对话框目录。如果该函数返回TRUE,则选中的目录名赋予变量m_Path,与选中的目录相关的图标在系统图标中的索引号赋予变量m_ImageIndex;如果返回FALSE,表明用户按下“取消”按钮放弃了此次操作或者程序中出现其他一些不可知错误。附源程序清单(本程序在中文Windows98,Visual C++ 6.0中调试通过):////////////////////////////////////////////////////////////////////////// BrowseDirDialog.h//////////////////////////////////////////////////////////////////////class CBrowseDirDialog{ public: CBrowseDirDialog(); virtual ~CBrowseDirDialog(); int DoBrowse(); CString m_Path; //存放返回的路径信息 CString m_InitDir; //初始显示的路径名,默认为桌面 CString m_SelDir; //打开对话框后,默认选中的目录名,缺省为根目录 CString m_Title; //设置对话框中浏览信息的标题,默认为"打开" int m_ImageIndex; }; /////////////////////////////////////////////////////////////////////////// // BrowseDirDialog.cpp ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "BrowseDirDialog.h" #include "shlobj.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif //SHBrowseForFolder控件在初始化或选择改变后的回调函数 static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { CBrowseDirDialog* pBrowseDirDialogObj = (CBrowseDirDialog*)lpData; if (uMsg == BFFM_INITIALIZED&& !pBrowseDirDialogObj->m_SelDir.IsEmpty()){ ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)(pBrowseDirDialogObj->m_SelDir)); } 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; } yangwu007(yangwu) :SHGetPathFromIDList(pidl,(unsigned short*)path);和ptext->SetWindowText((const unsigned short *)path); 这两句是不是有问题,怎么会是short*啊,而且编译不通过阿! 好像应该是 char 吧,win32系统上short和char不一样 BOOL SHGetPathFromIDList( LPCITEMIDLIST pidl, LPSTR pszPath);这是msdn上的解释,不好意思,我作这个程序时,是在com组件中作的,经常有一些莫名其妙的问题,改为short* 是我调了很长时间才解决的。当然,如果你不用作组件的话,就直接用msdn的解释吧,祝你成功! CString strResult; LPMALLOC lpMalloc; if (::SHGetMalloc(&lpMalloc) != NOERROR) { return; } char szDisplayName[_MAX_PATH]; char szBuffer[_MAX_PATH]; BROWSEINFO browseInfo; browseInfo.hwndOwner = m_hWnd; // set root at Desktop browseInfo.pidlRoot = NULL; browseInfo.pszDisplayName = szDisplayName; browseInfo.lpszTitle = "选择数据源所在目录:"; browseInfo.ulFlags = 0; browseInfo.lpfn = NULL; browseInfo.lParam = 0; LPITEMIDLIST lpItemIDList; if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL) { if (::SHGetPathFromIDList(lpItemIDList, szBuffer)) { if (szBuffer[0] == '\0') { return; } strResult = szBuffer; } else { return; } lpMalloc->Free(lpItemIDList); lpMalloc->Release(); } else { return; } 用vc+opengl实现大量三维点云数据的重建,哪位有过类似开发,请指点一下,谢谢。 如何卸载ImmInstallIME安装的输入法? socket多线程服务器中FD_SET怎么清理? 求助,vc++编译错误,在线等 多人一起编程怎么做啊 学深入浅出MFC 请问AFX_MODULE_STATE是怎么定义的 MSDN里我怎么找不到啊? 散分 使用GDI如何显示透明的PNG? 数据库中的“ cascade delete"是什么意思 一碟小菜。。。 关于字符类型的初级问题 通过TCP传输大数据时,为什么最后一个包接收端收不到?
可以用API直接写:
OnButtonBrowse()
{
// TODO: Add your control notification handler code here
BROWSEINFO bi;
char path[MAX_PATH];
ITEMIDLIST* pidl;
bi.hwndOwner=0;
bi.pidlRoot=0;
bi.lpszTitle=_T("请选择目录:");
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lpfn=0;
bi.iImage=0;
if(pidl=SHBrowseForFolder(&bi))
SHGetPathFromIDList(pidl,(unsigned short*)path);
//将取到的文件夹字符串放入编辑框中
CWnd* ptext=GetDlgItem(IDC_EDIT_FILEPATH);
ptext->SetWindowText((const unsigned short *)path); UpdateData();
}
<在Visual C++ 6.0环境下浏览目录对话框的设计>在VC++6.0编程中,经常要用到选择目录的功能,就象在 AppWizard中选择放置工作区目录一样。在MFC中提供了类似的标准文件对话框CfileDialog类,支持用户对文件的浏览、查找等操作。用SDK函数构造这么一个对话框至少需要几百行代码,用这个类可以简单地实现和Windows标准模式一致的文件打开、另存为等功能。但在MFC中并没有提供选择目录对话框的标准类,而这在有关目录路径操作中经常用到。
针对此问题,笔者设计了一个通用的浏览目录对话框的类CbrowseDirDialog,采用
Windows API函数SHBrowseForFolder。用户可以采用这个类浏览任何指定的目,磁盘,并返回用户最后选择的目录信息。
下面对这个类的使用作一简单介绍:
在CbrowseDirDialog.h头文件中,定义了如下成员变量和函数:
public:
CDirDialog();
virtual ~CDirDialog();
int DoBrowse();
CString m_Path;
CString m_InitDir;
CString m_SelDir;
CString m_Title;
int m_ImageIndex;
用户可以设置对话框中浏览信息的标题在m_Title变量中,如果用户不进行设置,系统默认标题为“打开”;设置起始显示目录在m_InitDir变量中,如用户需要列出C盘下的所有目录,只需在定义的对象中设置m_InitDir=“C:\\”, 如果用户不进行设置,系统默认为整个桌面;设置每次显示的默认目录在m_SelDir变量中,如果用户不进行设置,系统默认为根目录。最后,调用DoBrowse函数,即可显示选择对话框目录。如果该函数返回TRUE,则选中的目录名赋予变量m_Path,与选中的目录相关的图标在系统图标中的索引号赋予变量m_ImageIndex;如果返回FALSE,表明用户按下“取消”按钮放弃了此次操作或者程序中出现其他一些不可知错误。
附源程序清单(本程序在中文Windows98,Visual C++ 6.0中调试通过):
////////////////////////////////////////////////////////////////////////
// BrowseDirDialog.h
//////////////////////////////////////////////////////////////////////
class CBrowseDirDialog
{
public:
CBrowseDirDialog();
virtual ~CBrowseDirDialog();
int DoBrowse();
CString m_Path; //存放返回的路径信息
CString m_InitDir; //初始显示的路径名,默认为桌面
CString m_SelDir; //打开对话框后,默认选中的目录名,缺省为根目录
CString m_Title; //设置对话框中浏览信息的标题,默认为"打开"
int m_ImageIndex;
}; ///////////////////////////////////////////////////////////////////////////
// BrowseDirDialog.cpp
////////////////////////////////////////////////////////////////////// #include "stdafx.h"
#include "BrowseDirDialog.h"
#include "shlobj.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif //SHBrowseForFolder控件在初始化或选择改变后的回调函数
static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
CBrowseDirDialog* pBrowseDirDialogObj = (CBrowseDirDialog*)lpData;
if (uMsg == BFFM_INITIALIZED
&& !pBrowseDirDialogObj->m_SelDir.IsEmpty())
{
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)(pBrowseDirDialogObj->m_SelDir));
}
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;
}
SHGetPathFromIDList(pidl,(unsigned short*)path);
和ptext->SetWindowText((const unsigned short *)path); 这两句是不是有问题,怎么会是short*啊,而且编译不通过阿!
LPCITEMIDLIST pidl,
LPSTR pszPath
);这是msdn上的解释,不好意思,我作这个程序时,是在com组件中作的,经常有一些莫名其妙的问题,改为short* 是我调了很长时间才解决的。当然,如果你不用作组件的话,就直接用msdn的解释吧,祝你成功!
LPMALLOC lpMalloc;
if (::SHGetMalloc(&lpMalloc) != NOERROR)
{
return;
}
char szDisplayName[_MAX_PATH];
char szBuffer[_MAX_PATH];
BROWSEINFO browseInfo;
browseInfo.hwndOwner = m_hWnd; // set root at Desktop
browseInfo.pidlRoot = NULL;
browseInfo.pszDisplayName = szDisplayName;
browseInfo.lpszTitle = "选择数据源所在目录:";
browseInfo.ulFlags = 0;
browseInfo.lpfn = NULL;
browseInfo.lParam = 0;
LPITEMIDLIST lpItemIDList;
if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL)
{
if (::SHGetPathFromIDList(lpItemIDList, szBuffer))
{
if (szBuffer[0] == '\0')
{
return;
}
strResult = szBuffer;
}
else
{
return;
}
lpMalloc->Free(lpItemIDList);
lpMalloc->Release();
}
else
{
return;
}