我用API函数选择文件夹,
问题是每次启动选择文件夹对话框时,
初始文件夹总是"我的电脑",
而不像选择文件对话框默认的是最近用过的文件夹,
有什么办法让选择文件夹对话框的默认路径是最近用过的文件夹呢?
代码如下:
#include <SHLOBJ.H>
BYTE WindowSelectDir(HWND hWindow,
char *pPrompt,
char *pPath)

解决方案 »

  1.   

    {
    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;
      

  2.   

    BrowseInfo.lParam=0;
    BrowseInfo.iImage=0;
    ItemIDList=SHBrowseForFolder(&BrowseInfo);
    SHGetPathFromIDList(ItemIDList,pPath);
    if(pPath[0]==0){
    return 1;
    }else{
    return 0;
    }
    }
      

  3.   

    DWORD GetCurrentDirectory(
      DWORD nBufferLength,  // size, in characters, of directory buffer
      LPTSTR lpBuffer       // pointer to buffer for current directory
    );
      

  4.   

    int CALLBACK _SHBrowseForFolderProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
    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);
    调用!
      

  5.   

    好像是在消息回调函数中通过发消息的方法选中初始文件夹的,
    MFC+API感觉得怪异,
    没有更好的办法了么?
    我只想写一个函数.
      

  6.   

    http://hailongchang.spaces.live.com/                             //一个SDK下的例子
    #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;
    }