VC实现在浏览目录对话框中选择目录
2007-09-02 19:45
483 查看
使用MFC中的CFileDialog类,我们可以很方便的在目录对话框中选择打开或保存文件,但是有时我们需要的是在其中选择一个文件夹,这在MFC中并没有提供.这里提供一个简单的类来实现这个要求,是我在别人的程序代码中找到的.这个类是CDirDlg.
CDirDlg类的头文件DIR.H
#if!defined _THIS_IS_MY_DIRECTORY_SELECT_CLASS_
#define _THIS_IS_MY_DIRECTORY_SELECT_CLASS_
class CDirDlg
{
public:
CDirDlg();
virtual ~CDirDlg();
CString GetDirectory(CWnd *pParent=NULL,LPCSTR lpszRoot="c://",LPCSTR lpszTitle="Please Pick a Directory"
![](http://www.blogcn.com/images/wink.gif)
;
static CString m_sRootDir;
};
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData);
#endif
源文件DIR.CPP
#include "stdafx.h"
#include "dir.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
CString CDirDlg::m_sRootDir;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDirDlg::CDirDlg()
{
}
CDirDlg::~CDirDlg()
{
}
CString CDirDlg::GetDirectory(CWnd *pParent,LPCSTR lpszRoot,LPCSTR lpszTitle)
{
CString str;
BROWSEINFO bi;
bi.hwndOwner=pParent->m_hWnd; //owner of created dialog box
bi.pidlRoot=0; //unused
bi.pszDisplayName=0; //buffer to receive name displayed by folder (not a valid path)
bi.lpszTitle=lpszTitle; //title is "Browse for Folder", this is an instruction
bi.lpfn = BrowseCallbackProc; //callback routine called when dialog has been initialized
bi.lParam=0; //passed to callback routine
bi.ulFlags=
BIF_RETURNONLYFSDIRS | //only allow user to select a directory
BIF_STATUSTEXT | //create status text field we will be writing to in callback
// BIF_BROWSEFORCOMPUTER| //only allow user to select a computer
// BIF_BROWSEFORPRINTER | //only allow user to select a printer
// BIF_BROWSEINCLUDEFILES| //displays files too which user can pick
// BIF_DONTGOBELOWDOMAIN| //when user is exploring the "Entire Network" they
// are not allowed into any domain
0;
m_sRootDir=lpszRoot;
LPITEMIDLIST lpItemId=::SHBrowseForFolder(&bi);
if (lpItemId)
{
LPTSTR szBuf=str.GetBuffer(MAX_PATH);
::SHGetPathFromIDList(lpItemId, szBuf);
::GlobalFree(lpItemId);
str.ReleaseBuffer();
}
return str;
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT msg,LPARAM lp, LPARAM pData)
{
TCHAR buf[MAX_PATH];
switch(msg)
{
// when dialog is first initialized, change directory to one chosen above
case BFFM_INITIALIZED:
strcpy(buf,CDirDlg::m_sRootDir);
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)buf);
break;
// if you picked BIF_STATUSTEXT above, you can fill status here
case BFFM_SELCHANGED:
if (::SHGetPathFromIDList((LPITEMIDLIST) lp ,buf))
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buf);
break;
}
return 0;
}
使用方法:在你的工程中添加这两个文件进去,然后会在类视图中出现在CDirDlg类,该类中只有一个方法GetDirectory(),可以像下面这样用:
CDirDlg dlg;
m_strPath=dlg.GetDirectory(this,"我的电脑"
![](http://www.blogcn.com/images/wink.gif)
;
CDirDlg类的头文件DIR.H
#if!defined _THIS_IS_MY_DIRECTORY_SELECT_CLASS_
#define _THIS_IS_MY_DIRECTORY_SELECT_CLASS_
class CDirDlg
{
public:
CDirDlg();
virtual ~CDirDlg();
CString GetDirectory(CWnd *pParent=NULL,LPCSTR lpszRoot="c://",LPCSTR lpszTitle="Please Pick a Directory"
![](http://www.blogcn.com/images/wink.gif)
;
static CString m_sRootDir;
};
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData);
#endif
源文件DIR.CPP
#include "stdafx.h"
#include "dir.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
CString CDirDlg::m_sRootDir;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDirDlg::CDirDlg()
{
}
CDirDlg::~CDirDlg()
{
}
CString CDirDlg::GetDirectory(CWnd *pParent,LPCSTR lpszRoot,LPCSTR lpszTitle)
{
CString str;
BROWSEINFO bi;
bi.hwndOwner=pParent->m_hWnd; //owner of created dialog box
bi.pidlRoot=0; //unused
bi.pszDisplayName=0; //buffer to receive name displayed by folder (not a valid path)
bi.lpszTitle=lpszTitle; //title is "Browse for Folder", this is an instruction
bi.lpfn = BrowseCallbackProc; //callback routine called when dialog has been initialized
bi.lParam=0; //passed to callback routine
bi.ulFlags=
BIF_RETURNONLYFSDIRS | //only allow user to select a directory
BIF_STATUSTEXT | //create status text field we will be writing to in callback
// BIF_BROWSEFORCOMPUTER| //only allow user to select a computer
// BIF_BROWSEFORPRINTER | //only allow user to select a printer
// BIF_BROWSEINCLUDEFILES| //displays files too which user can pick
// BIF_DONTGOBELOWDOMAIN| //when user is exploring the "Entire Network" they
// are not allowed into any domain
0;
m_sRootDir=lpszRoot;
LPITEMIDLIST lpItemId=::SHBrowseForFolder(&bi);
if (lpItemId)
{
LPTSTR szBuf=str.GetBuffer(MAX_PATH);
::SHGetPathFromIDList(lpItemId, szBuf);
::GlobalFree(lpItemId);
str.ReleaseBuffer();
}
return str;
}
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT msg,LPARAM lp, LPARAM pData)
{
TCHAR buf[MAX_PATH];
switch(msg)
{
// when dialog is first initialized, change directory to one chosen above
case BFFM_INITIALIZED:
strcpy(buf,CDirDlg::m_sRootDir);
::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)buf);
break;
// if you picked BIF_STATUSTEXT above, you can fill status here
case BFFM_SELCHANGED:
if (::SHGetPathFromIDList((LPITEMIDLIST) lp ,buf))
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buf);
break;
}
return 0;
}
使用方法:在你的工程中添加这两个文件进去,然后会在类视图中出现在CDirDlg类,该类中只有一个方法GetDirectory(),可以像下面这样用:
CDirDlg dlg;
m_strPath=dlg.GetDirectory(this,"我的电脑"
![](http://www.blogcn.com/images/wink.gif)
;
相关文章推荐
- VC++实现文件选择对话框 及目录
- VC++, MFC中实现选择文件夹,选择文件对话框,确定当前工作目录(转载)
- VB 选择目录对话框实现(API)
- VC++实现文件选择对话框
- VC 使用"文件浏览"对话框选择文件夹
- VC++ 实现文件夹选择对话框.FolderBrowser
- VC打开一个目录选择对话框,并设置初始化目录
- VC++选择文件对话框实现
- 一个可以记住上一次的选择的选择目录的对话框的实现代码段
- 用VC调用Shell中的目录浏览对话框
- VC++实现文件选择对话框
- VC 文件对话框 目录选择
- 用VC调用Shell中的目录浏览对话框
- 浏览...(Browse...):目录选择和文件选择 对话框
- 用VB实现目录选择+浏览
- 如何在vba中实现目录浏览对话框
- VC中选择目录对话框
- 用VC调用Shell中的目录浏览对话框
- 记录:VC++中打开保存目录选择对话框操作
- VC++中打开保存目录选择对话框操作