void GetDir(const char *Title, CString &Path)
{
LPMALLOC pIMalloc ;
if (::SHGetMalloc(&pIMalloc))
{
return;
}
char szBuff[MAX_PATH];
lstrcpy(szBuff,Path);
BROWSEINFO bi;
::FillMemory(&bi, sizeof(BROWSEINFO), 0);
bi.hwndOwner = NULL ;// acedGetAcadWinApp() ;   // m_hWnd;
bi.pidlRoot = NULL;
bi.pszDisplayName = szBuff;

//text to display within the dialog
bi.lpszTitle = Title;
bi.ulFlags = BIF_RETURNONLYFSDIRS;// only want folders

// this is the directory you want to start from
char szPath[MAX_PATH];
lstrcpy(szPath, Path);
bi.lParam = (LPARAM)szPath;
bi.lpfn =  NULL;  //BrowseCallBack;

//returns NULL if user cancels
ITEMIDLIST *browseList = NULL;
browseList = ::SHBrowseForFolder(&bi);
if (browseList)
{
::SHGetPathFromIDList(browseList, szBuff);
Path = szBuff;
pIMalloc->Free(browseList);
}
pIMalloc->Release() ;
}

解决方案 »

  1.   

    LPSTR CTempDlg::OnBtBrows(LPSTR TileName) 
    {
    char SelectPath[MAX_PATH],dispname[MAX_PATH];
    BROWSEINFO bi;  
        ITEMIDLIST * pidl;  
        bi.hwndOwner = m_hWnd;  
        bi.pidlRoot = 0;  

        bi.pszDisplayName = dispname;  
        bi.lpszTitle = TileName;  
        bi.ulFlags = BIF_RETURNONLYFSDIRS;  
        bi.lpfn = BrowseCallbackProc;  
        bi.iImage = 0;  
        
        if (pidl = SHBrowseForFolder(&bi)) 
        {  
            SHGetPathFromIDList(pidl, SelectPath);
    return SelectPath;
        }
    }int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
    //char *a=(char *)lParam;

    switch(uMsg){
    case BFFM_INITIALIZED:
    ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,LPARAM("C:\\"));
    break;
    case BFFM_SELCHANGED:
    {
    char curr[MAX_PATH];
    SHGetPathFromIDList((LPCITEMIDLIST)lParam,curr);
    if(curr[strlen(curr)-1]==92)
    sprintf(curr,"%sSictech",curr);
    else
    sprintf(curr,"%s\\Sictech",curr);
    ::SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)curr);
    }
    break;
    }
    return 0;
    }
    char *c=OnBtBrows("标题");
      

  2.   

    class CDirDlg  
    {
    public:
    CDirDlg();
    virtual ~CDirDlg();
    CString GetDirectory(CWnd *pParent=NULL,LPCSTR lpszRoot="c:\\",LPCSTR lpszTitle="Please Pick a Directory");
    static CString m_sRootDir;
    };
    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData);
    CString CDirDlg::m_sRootDir;
    CDirDlg::CDirDlg()
    {
    }
    CDirDlg::~CDirDlg()
    {
    }
    CString CDirDlg::GetDirectory(CWnd *pParent,LPCSTR lpszRoot,LPCSTR lpszTitle)
    {
        CString str;
        BROWSEINFO bi;
        bi.hwndOwner=pParent->m_hWnd;
        bi.pidlRoot=0;
        bi.pszDisplayName=0;
        bi.lpszTitle=lpszTitle;
        bi.lpfn = BrowseCallbackProc;
        bi.lParam=0;
        bi.ulFlags=
    BIF_RETURNONLYFSDIRS |BIF_STATUSTEXT |0; 
    m_sRootDir=lpszRoot;
    LPITEMIDLIST lpItemId=::SHBrowseForFolder(&bi); 
    if (lpItemId)
    {
    LPTSTR szBuf=str.GetBuffer(MAX_PATH);
    ::SHGetPathFromIDList(lpItemId, szBuf);
    ::GlobalFree(lpItemId);
    str.ReleaseBuffer();
    }
    return str;
    }
    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT msg,LPARAM lp, LPARAM pData)
    {
    TCHAR buf[MAX_PATH];
    switch(msg) 
    {
    case BFFM_INITIALIZED: 
    strcpy(buf,CDirDlg::m_sRootDir);
    ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)buf);
    break;
    case BFFM_SELCHANGED:
    if (::SHGetPathFromIDList((LPITEMIDLIST) lp ,buf)) 
    SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)buf);
    break;
    }
    return 0;
    }
    void CTestopendirctory01Dlg::OnButtonDirectory() 
    {
    // TODO: Add your control notification handler code here
    CDirDlg dlg;
    CString strVedioPath;
    strVedioPath = dlg.GetDirectory(this,m_nFileDirectory);
    if (strVedioPath == "")
    {
    GetDlgItem(IDC_EDIT_FILE_DIRECTORY)->SetWindowText(m_nFileDirectory);
    }
    else
    {
    m_nFileDirectory = strVedioPath;
    GetDlgItem(IDC_EDIT_FILE_DIRECTORY)->SetWindowText(m_nFileDirectory);
    }}
      

  3.   


    感觉都有点答非所问缺省路径要用BrowseCallbackProc ,又要类变量(等于全局变量)。
    难道就不可以做成void GetDir(const char *Title, CString &Path) 这样的函数吗?
      

  4.   

    #include "shlobj.h"
    //
    //从对话框中选择目录
    //
    static CString GetDir()
    {
    CString sFolderPath;
    char Buffer[MAX_PATH];
    int nID = 0 ;
    LPITEMIDLIST pIDList = PidlBrowse(NULL,nID,Buffer);//调用显示选择对话框
    if(pIDList)
    {
    //取得文件夹路径到Buffer里
    SHGetPathFromIDList(pIDList, Buffer);
    //将路径保存在一个CString对象里
    sFolderPath = Buffer;
    }
    LPMALLOC lpMalloc;
    if(FAILED(SHGetMalloc(&lpMalloc))) return _T("");
    //释放内存
    lpMalloc->Free(pIDList);
    lpMalloc->Release();
    return sFolderPath;
    }; //
    //从对话框中选择目录调用的方法
    //
    static LPITEMIDLIST PidlBrowse(HWND hwnd, int nCSIDL, LPSTR pszDisplayName)
    {
    LPITEMIDLIST pidlRoot = NULL;
    LPITEMIDLIST pidlSelected = NULL;
    BROWSEINFO bi = {0};
    LPMALLOC pMalloc = NULL; SHGetMalloc(&pMalloc); if(nCSIDL)
    {
    SHGetSpecialFolderLocation(hwnd, nCSIDL,  &pidlRoot);
    } else
    {
    pidlRoot = NULL;
    } bi.hwndOwner = hwnd;
    bi.pidlRoot = pidlRoot;
    bi.pszDisplayName = pszDisplayName;
    bi.lpszTitle = "Choose the target folder:";
    bi.ulFlags = 0;
    bi.lpfn = NULL;
    bi.lParam = 0; pidlSelected = SHBrowseForFolder(&bi); if(pidlRoot)
    {
    pMalloc->Free(pidlRoot);
    }
    pMalloc->Release();
    return pidlSelected;
    }
      

  5.   

    chuanke((C ) 2005【空间代数】. All rights reserved .) 应该可以显示缺省路径的, 但是必须做成类, 这里提出的问题是用函数,形式如void GetDir(const char *Title, CString &Path),
    关键是回调函数里居然用了类静态变量(其实是全局变量)。
      

  6.   

    看来问了一个没有答案的问题,SHBrowseForFolder函数也许设计就是只可以这样用。
    谢谢 chuanke((C ) 2005【空间代数】. All rights reserved .)