浏览对话框代码:
{ BROWSEINFO bi; char buffer[MAX_PATH]; ZeroMemory(buffer,MAX_PATH); bi.hwndOwner=GetSafeHwnd(); bi.pidlRoot=NULL; bi.pszDisplayName=buffer; bi.lpszTitle="选择一个文件夹"; bi.ulFlags=BIF_EDITBOX; bi.lpfn=NULL; bi.lParam=0; bi.iImage=0; LPITEMIDLIST pList=NULL; if((pList=SHBrowseForFolder(&bi))!=NULL) { char path[MAX_PATH]; ZeroMemory(path,MAX_PATH); SHGetPathFromIDList(pList,path); GetDlgItem(IDC_EDADD)->SetWindowText(path); }}
程序说明分析:
WINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder( LPBROWSEINFO lpbi ); SHBrowseForFolder函数返回一个ITEMIDLIST结构的指针,这个结构包含了用户选择文件夹的信息,需要注意的是,SHBrowseForFolder函数要求调用程序负责删除这个指针。如果用户选择了“取消”按钮,则返回NULL。SHBrowseForFolder函数的参数是一个BROWSEINFO结构变量,它的定义如下: typedef struct _browseinfo { HWND hwndOwner; // 父窗口的句柄 LPCITEMIDLIST pidlRoot; // 一个ITEMIDLIST结构变量,指定根目录 LPSTR pszDisplayName; // LPCSTR lpszTitle; // 位于对话框顶端的一行文字 UINT ulFlags; // 标志变量,按位有效 BFFCALLBACK lpfn; // 回调函数 LPARAM lParam; // 传给回调函数的参数,一个32位值 int iImage; // 被选择的文件夹的图片序号,与shell32.dll中的图标号同 } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO; ulFlags参数在浏览文件夹时一般取值为BIF_BROWSEFORCOMPUTER,这样,对话框将只允许指定在实际文件系统中存在的文件夹,否则“确定”按钮将会被禁用。 如果SHBrowseForFolder函数返回的ITEMIDLIST结构指针不为NULL,就可以使用SHGetPathFromIDList函数取得存储于ITEMIDLIST结构指针中的路径信息。SHGetPathFromIDList函数的原型如下: WINSHELLAPI BOOL WINAPI SHGetPathFromIDList( LPCITEMIDLIST pidl, LPSTR pszPath ); 第一个参数就是存储了路径信息的ITEMIDLIST结构指针,第二个参数是一个字符缓冲区,用于接收字符串。它应当有_MAX_PATH所指定的长度,_MAX_PATH在Windows系统中被定义为260个字符,其大小可以是260或520个字节,这取决于是否使用了Unicode。 现在,让我们来制作一个工程。打开App Wizard,创建一个MFC EXE对话框工程,名为SelFolder,然后在Workspace窗口的FileView中将SelFolder.rc,SelFolder.h,SelFolderDlg.h,SelFolderDlg.cpp,Resource.h及以Res文件夹都删除,只保留SelFolder.cpp、Stdafx.h和Stdafx.cpp三个文件,现将SelFolder.cpp文件修改如下: #include "stdafx.h" struct CSelFolderApp : public CWinApp { virtual BOOL InitInstance(); } theApp; BOOL CSelFolderApp::InitInstance() { // 要求Windows 95/NT4 或更新版本 ASSERT(LOBYTE(LOWORD(GetVersion())) >= 4); TCHAR szPath[_MAX_PATH]; BROWSEINFO bi; // 指定父窗口,在对话框显示期间,父窗口将被禁用 bi.hwndOwner = NULL; // 如果指定NULL,就以“桌面”为根 bi.pidlRoot = NULL; // 这一行将显示在对话框的顶端 bi.lpszTitle = _T("请选择一个文件夹"); bi.pszDisplayName = szPath; // 只返回文件系统中存在的文件夹 bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; // 回调函数的指针 bi.lParam = NULL; // 传向回调函数的参数 // 现在,调用函数来显示对话框 // 它总与Windows的外壳程序Explorer保持相同的外观 LPITEMIDLIST pItemIDList = SHBrowseForFolder( &bi ); if ( pItemIDList ) // 点按了“确定”按钮 { TCHAR szPath[ _MAX_PATH ]; if ( SHGetPathFromIDList(pItemIDList, szPath) ) { // 成功地取得了文件夹信息 CString strMessage; strMessage.Format("选定的文件夹是/'%s/'", szPath); AfxMessageBox( strMessage ); } // 防止内存泄漏,要使用IMalloc接口 IMalloc* pMalloc; if ( SHGetMalloc( &pMalloc ) != NOERROR ) { // 未返回有效的IMalloc接口指针 TRACE(_T("无法取得外壳程序的IMalloc接口/n")); } pMalloc->Free( pItemIDList ); if ( pMalloc ) pMalloc->Release(); } // 已完成任务,所以返回FALSE来终止进程 return FALSE; } // InitInstance
本文来自博客,转载请标明出处:file:///D:/我的文档/桌面/vc学习历程(7)--文件浏览对话框%20-%20lin_angle的专栏%20-%20博客.mht