我用API函数选择文件夹,
问题是每次启动选择文件夹对话框时,
初始文件夹总是"我的电脑",
而不像选择文件对话框默认的是最近用过的文件夹,
有什么办法让选择文件夹对话框的默认路径是最近用过的文件夹呢?
代码如下:
#include <SHLOBJ.H>
BYTE WindowSelectDir(HWND hWindow,
char *pPrompt,
char *pPath)
问题是每次启动选择文件夹对话框时,
初始文件夹总是"我的电脑",
而不像选择文件对话框默认的是最近用过的文件夹,
有什么办法让选择文件夹对话框的默认路径是最近用过的文件夹呢?
代码如下:
#include <SHLOBJ.H>
BYTE WindowSelectDir(HWND hWindow,
char *pPrompt,
char *pPath)
BROWSEINFO BrowseInfo;
ITEMIDLIST *ItemIDList;
memset(&BrowseInfo,0,sizeof(BrowseInfo));
BrowseInfo.hwndOwner=hWindow;
BrowseInfo.pidlRoot=0;
BrowseInfo.pszDisplayName=pPath;
BrowseInfo.lpszTitle=pPrompt;
BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
BrowseInfo.lpfn=0;
BrowseInfo.iImage=0;
ItemIDList=SHBrowseForFolder(&BrowseInfo);
SHGetPathFromIDList(ItemIDList,pPath);
if(pPath[0]==0){
return 1;
}else{
return 0;
}
}
DWORD nBufferLength, // size, in characters, of directory buffer
LPTSTR lpBuffer // pointer to buffer for current directory
);
{
if(uMsg == BFFM_INITIALIZED)
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
return 1;
}BOOL CMake::BrowseProc(CString *lpstrFolder, CString strIniFolder, BOOL bAvailNewFolder)
{
BOOL ret;
char lpszPath[MAX_PATH];
LPMALLOC lpMalloc;
BROWSEINFO sInfo;
LPITEMIDLIST lpidlBrowse;
if(!lpstrFolder)
return FALSE;
if(::SHGetMalloc(&lpMalloc) != NOERROR)
return FALSE;
ret = FALSE;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = NULL;
sInfo.pszDisplayName = lpszPath;
sInfo.lpszTitle = "Customer code directory only";
sInfo.ulFlags = BIF_RETURNONLYFSDIRS;
if(bAvailNewFolder == TRUE)
sInfo.ulFlags |= BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;
sInfo.lpfn = _SHBrowseForFolderProc;
sInfo.lParam = (LPARAM)strIniFolder.GetBuffer(0);
lpidlBrowse = ::SHBrowseForFolder(&sInfo); //显示文件夹选择对话框
if(lpidlBrowse)
{
if(::SHGetPathFromIDList(lpidlBrowse,lpszPath)) //取得文件夹名
*lpstrFolder = lpszPath;
ret = TRUE;
}
if(lpidlBrowse)
::CoTaskMemFree(lpidlBrowse);
lpMalloc->Release();
return ret;
}//产生目录浏览对话框
if(BrowseProc(&m_Customer_Code_Directory,m_Customer_Code_Directory,TRUE))
UpdateData(FALSE);
调用!
MFC+API感觉得怪异,
没有更好的办法了么?
我只想写一个函数.
#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;
}
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);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
ShowSHBrowseForFolderDemoDlg();
return 0;
}