int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)//回调函数
{
if (uMsg==BFFM_INITIALIZED)
{
//设置初始目录
if (lpData)
SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)lpData);
}
return TRUE;
}
CString getpath(CWnd* cw)
{
char pBuffer[256];
CString temp;
char currentdirbuf[255]="";
GetCurrentDirectory(255,currentdirbuf);
BROWSEINFO bi;
memset(&bi,0,sizeof(BROWSEINFO));
bi.hwndOwner=cw->m_hWnd;
bi.lpszTitle="生成程序前,先为ut文件选择保存文件夹";
//bi.pszDisplayName=selectpath_or_lastpath.GetBuffer(0);
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lParam=(LPARAM)currentdirbuf;
ATLTRACE("currentdirbuf=%s/n",currentdirbuf);
bi.lpfn=BrowseCallbackProc;//回调函数
ITEMIDLIST *pIDList = SHBrowseForFolder(&bi);
if(pIDList)
{
SHGetPathFromIDList(pIDList,pBuffer);
GlobalFree(pIDList);
char systembuf[255]="";
GetSystemDirectory(systembuf,255);
strcat_s(systembuf,"//last_pathname.ini");
CStdioFile file;
file.Open(systembuf,CFile::modeCreate|CFile::modeWrite);
file.SeekToBegin();
file.WriteString(pBuffer);
file.Close();
//LPMALLOC pMalloc=NULL;
//if (SUCCEEDED(SHGetMalloc(&pMalloc)))
//{
// pMalloc->Free(pIDList);
// pMalloc->Release();
// //return;
//}
}
ATLTRACE("pBuffer=%s/n",pBuffer);
temp.Format("%s",pBuffer);
return temp;
}
解释一下这个函数用到的一些值的含义。
1. BROWSEINFO
它是一个结构, 原型是
typedef struct _browseinfo {
HWND hwndOwner; // 弹出的dialog的父窗体的句柄
LPCITEMIDLIST pidlRoot; // 指向一个ITEMIDLIST的指针,我们会在后边介绍ITEMIDLIST结构,可空
LPSTR pszDisplayName; // 指向一个buffer,这个buffer用来存放用户选中的目录,buffer的size为MAX_PATH
LPCSTR lpszTitle; //指向一个非空的string,用来显示树目录之上的指示信息
UINT ulFlags; // 指出了显示的文件夹的类型
BFFCALLBACK lpfn; //回调函数,一般不用,简单的记为NULL
LPARAM lParam; // 当lpfn不为空时,把dialogbox的值传给回调函数lpfn
int iImage; // 系统的图标list的索引,当用户选中目录的时候,得到这个索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
ulFlags的可能取值为:
BIF_BROWSEFORCOMPUTER ——只返回"我的电脑",当选中"我的电脑"之外的目录时,OK键为灰色
BIF_BROWSEFORPRINTER ——只返回"打印机",当选中"打印机"之外的目录时,OK键为灰色
BIF_DONTGOBELOWDOMAIN ——不包括"网上邻居"
BIF_RETURNFSANCESTORS ——只返回"我的文件",当选中"我的文件"之外的目录时,OK键为灰色
BIF_RETURNONLYFSDIRS ——同上
BIF_STATUSTEXT ——Includes a status area in the dialog box. The callback can set the status text by sending messages to the dialog box.
2. ITEMIDLIST
是一个结构,指明了默认浏览的根文件夹的位置,可以为空,那样的话,默认为桌面文件夹的文件目录.
原型为
typedef struct _ITEMIDLIST
{
SHITEMID mkid; // list of item identifers
} ITEMIDLIST, * LPITEMIDLIST;
typedef const ITEMIDLIST * LPCITEMIDLIST;
3. 把项目标示符表(LPITEMIDLIST类型,SHBrowseForFolder函数的返回值)转换为文件路径:
4.回调函数: