封装一个路径选择对话框

class CPathDialog : public CObject
{
public:
    CPathDialog(LPCTSTR lpszTitle, LPCTSTR pszInitPath=NULL,HWND hParent=NULL);
    virtual ~CPathDialog();
    
    int DoModal();
    CString GetPathName() const;
    static int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData);

private:
    HWND m_hParentWnd;
    CString m_strTitle;
    int m_nRootFolder;
    TCHAR m_szPathName[MAX_PATH];
};

CPathDialog::CPathDialog(LPCTSTR lpszTitle, LPCTSTR pszInitPath,HWND hParent):
    m_hParentWnd(hParent),m_strTitle(lpszTitle)
{
    if (pszInitPath)
        _tcscpy(m_szPathName, pszInitPath);
    else
        m_szPathName[0] = '\0';
    m_nRootFolder = CSIDL_DRIVES;
}

CPathDialog::~CPathDialog()
{
}

int CPathDialog::DoModal()
{
    int ret = IDCANCEL;
    LPITEMIDLIST pid1 = NULL, pid2 = NULL;
    LPMALLOC pMalloc = NULL;
    VERIFY(SUCCEEDED(::CoInitialize(NULL)));
    if (m_nRootFolder == 0)
    {
        pid1 = NULL;
    }
    else
    {
        if (!SUCCEEDED(SHGetSpecialFolderLocation(m_hParentWnd, m_nRootFolder, &pid1)))
            goto Done;
    }
    
    if (NOERROR == ::SHGetMalloc(&pMalloc))
    {
        BROWSEINFO bi;
        bi.hwndOwner = m_hParentWnd;
        bi.lpfn = &BrowseCallbackProc;
        bi.pszDisplayName = m_szPathName;
        bi.ulFlags = BIF_STATUSTEXT|BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
        bi.lpszTitle = (LPCTSTR)m_strTitle;
        bi.pidlRoot = pid1;
        bi.lParam = (LPARAM)m_szPathName;
        if ((pid2 = ::SHBrowseForFolder(&bi)) != NULL)
        {
            if (::SHGetPathFromIDList(pid2, m_szPathName))
                ret = IDOK;
            pMalloc->(Free(pid2));
        }
    }
    
    if (NULL != pMalloc && pid1 != NULL)
    {
        pMalloc->Free(pid1);
    }
    if (pMalloc != NULL)
    {
        pMalloc->Release();
    }
Done:
    CoUninitialize();
    return ret;
}

CString CPathDialog::GetPathName() const
{
    return m_szPathName;
}

int CALLBACK CPathDialog::BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
{
    TCHAR szPath[MAX_PATH] = {'\0'};
    switch (uMsg)
    {
    case BFFM_INITIALIZED:
        PostMessage(hwnd, BFFM_SETSELECTION, (WPARAM)1, (LPARAM)lpData);
        break;
    case BFFM_SELCHANGED:
        ::SHGetPathFromIDList((LPITEMIDLIST)lParam, szPath);
        SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0L, (LPARAM)szPath);
        break;
    default:
        break;
    }
    return 0;
}

发布了78 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zeqi1991/article/details/95042732