SHBrowseForFolder是一个windows shell函数,可以以目录为单位进行浏览,其函数原型为:
LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFOlpbi);
参数lpbi是一个指向结构BROWSEINFO的指针,该结构的定义如下:
typedef struct _browseinfo {
HWND hwndOwner;
LPCITEMIDLIST pidlRoot; //指向一个item identifier list指针,设置开始浏览的默认目录
LPTSTR pszDisplayName;
LPCTSTR lpszTitle; //设置浏览对话框的标题,可以用这个变量对用户进行提示
UINT ulFlags;
BFFCALLBACK lpfn; //回调函数的地址,即基于该浏览对话框的窗口过程
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
HWND hwndOwner;
LPCITEMIDLIST pidlRoot; //指向一个item identifier list指针,设置开始浏览的默认目录
LPTSTR pszDisplayName;
LPCTSTR lpszTitle; //设置浏览对话框的标题,可以用这个变量对用户进行提示
UINT ulFlags;
BFFCALLBACK lpfn; //回调函数的地址,即基于该浏览对话框的窗口过程
LPARAM lParam;
int iImage;
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
由BROSEINFO的原型可以看出,很难设置一个默认的目录。可以在ulFlags中设置BIF_VALIDATE并设置一个回调函数来处理BFFM_INITIALIZED消息(该消息表示对话框已经为调用作好准备),在处理该消息时再SendMessage一个BFFM_SETSELECTION消息给窗口过程,并把初始目录的字符串作为LPARAM参数传递.下面的代码把初试目录设置为了"C:/Program Filese"
......
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,TRUE,(LPARAM)_T("C://Program Files"));
}
......
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,TRUE,(LPARAM)_T("C://Program Files"));
}
......
以下是在vc++.net 2003中的一个例子。
#include<shlobj.h> //SHBrowseForFolder在shlobj.h中定义
#include<TCHAR.h>
#include<windows.h>
#include<shlobj.h> //SHBrowseForFolder在shlobj.h中定义
#include<TCHAR.h>
#include<windows.h>
int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,
TRUE,(LPARAM)_T("C://Program Files"));
}
return 0;
}
{
if(uMsg == BFFM_INITIALIZED)
{
SendMessage(hwnd, BFFM_SETSELECTION,
TRUE,(LPARAM)_T("C://Program Files"));
}
return 0;
}
void ShowSHBrowseForFolderDemoDlg()
{
TCHAR m_dir[500];
BROWSEINFO bi = {0};
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS|BIF_VALIDATE;
bi.lpszTitle = _T("请选择保存计算结果文件的位置");
bi.lpfn = BrowseCallbackProc; //指定回调函数地址
ITEMIDLIST *pIDL = SHBrowseForFolder(&bi);
if(SHGetPathFromIDList(pIDL,m_dir) == TRUE) //变量m_dir中存储了经过用户选择后的目录的完整路径.
{
MessageBox(NULL,m_dir,"sample",0);
}
}
{
TCHAR m_dir[500];
BROWSEINFO bi = {0};
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS|BIF_VALIDATE;
bi.lpszTitle = _T("请选择保存计算结果文件的位置");
bi.lpfn = BrowseCallbackProc; //指定回调函数地址
ITEMIDLIST *pIDL = SHBrowseForFolder(&bi);
if(SHGetPathFromIDList(pIDL,m_dir) == TRUE) //变量m_dir中存储了经过用户选择后的目录的完整路径.
{
MessageBox(NULL,m_dir,"sample",0);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
ShowSHBrowseForFolderDemoDlg();
return 0;
}
{
ShowSHBrowseForFolderDemoDlg();
return 0;
}