mfc中打开文件夹

//
//.h
class CBrowseDirDialog 
{  
public:  
    CBrowseDirDialog();  
    virtual ~CBrowseDirDialog();  
    int DoBrowse(); 
    CString GetPath();
    CString GetSelDir();

protected:
    CString m_Path;        //存放返回的路径信息  
    CString m_InitDir;    //初始显示的路径名,默认为桌面  
    CString m_SelDir;    //打开对话框后,默认选中的目录名,缺省为根目录  
    CString m_Title;    //设置对话框中浏览信息的标题,默认为"打开"  
    int m_ImageIndex;  
};
//
//.cpp
#include "stdafx.h"  
#include "BrowserDirDlg.h"  
#include "shlobj.h"  
 

//SHBrowseForFolder控件在初始化或选择改变后的回调函数  
static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 
{  
    CBrowseDirDialog* pBrowseDirDialogObj = (CBrowseDirDialog*)lpData;  
    if (uMsg == BFFM_INITIALIZED 
    && !pBrowseDirDialogObj->GetSelDir().IsEmpty()) 
    {  
    ::SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)(LPCTSTR)(pBrowseDirDialogObj->GetSelDir()));  
    }  
    else // uMsg == BFFM_SELCHANGED  
    {  
    }  
    return 0;  
}  
//构造函数  
CBrowseDirDialog::CBrowseDirDialog()  
{  
}  
//析构函数  
CBrowseDirDialog::~CBrowseDirDialog()  
{  
}  
int CBrowseDirDialog::DoBrowse()  
{  
    LPMALLOC pMalloc;  
    if (SHGetMalloc (&pMalloc)!= NOERROR)  
    {  
    return 0;  
    }  
    BROWSEINFO bInfo;  
    LPITEMIDLIST pidl;  
    ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));  
    if (!m_InitDir.IsEmpty ())  
    {  
    OLECHAR olePath[MAX_PATH];  
    ULONG chEaten;  
    ULONG dwAttributes;  
    HRESULT hr;  
    LPSHELLFOLDER pDesktopFolder;  
    if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))  
    {  
    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED, m_InitDir.GetBuffer(MAX_PATH), -1,  
    olePath, MAX_PATH);  

    m_InitDir.ReleaseBuffer (-1);  
    //转换路径为ITEMLIST  
    hr = pDesktopFolder->ParseDisplayName(NULL,NULL,olePath,&chEaten,&pidl,  
    &dwAttributes);  
    if (FAILED(hr))  
    {  
    pMalloc ->Free (pidl);  
    pMalloc ->Release ();  
    return 0;  
    }  
    bInfo.pidlRoot = pidl;  
    }  
    }  
    bInfo.hwndOwner = NULL;  
    bInfo.pszDisplayName = m_Path.GetBuffer (MAX_PATH);  
    bInfo.lpszTitle = (m_Title.IsEmpty()) ? "打开":m_Title;  
    bInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;  
    bInfo.lpfn = BrowseCtrlCallback; //回调函数地址  
    bInfo.lParam = (LPARAM)this;  
    if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)  
    {  
    return 0;  
    }  
    m_Path.ReleaseBuffer();  
    m_ImageIndex = bInfo.iImage;  
    if (::SHGetPathFromIDList(pidl,m_Path.GetBuffer(MAX_PATH)) == FALSE)  
    {  
    pMalloc ->Free(pidl);  
    pMalloc ->Release();  
    return 0;  
    }  
    m_Path.ReleaseBuffer();  
    pMalloc ->Free(pidl);  
    pMalloc ->Release();  
    return 1;  



CString CBrowseDirDialog::GetPath()
{
    return m_Path;
}

CString CBrowseDirDialog::GetSelDir()
{
    return m_SelDir;
}
///


需要微软sdk的支持

MFC打开文件和文件 一、利用API实现打开文件对话框和利用MFC来实现打开文件对话框。 方法一:API部分: // OPENFILENAME ofn; // TCHAR szFile[MAX_PATH]; // ZeroMemory(&ofn,sizeof(ofn)); // ofn.lStructSize = sizeof(ofn); // ofn.lpstrFile = szFile; // ofn.lpstrFile[0] = TEXT('/0'); // ofn.nMaxFile = sizeof(szFile); // ofn.lpstrFilter = TEXT("all/0*.*/0jpg/0*.jpg/0bmp/0*.bmp/0"); //定义三个选项,all,text和exe // ofn.nFilterIndex = 1; //定义首选项是哪一个 // ofn.lpstrFileTitle = NULL; // ofn.nMaxFileTitle = 0; // ofn.lpstrInitialDir = NULL; // ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; // if(GetOpenFileName(&ofn)) // { // ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,szFile); // } 方法二、MFC实现 // CFileDialog dlg(TRUE, NULL, NULL, // OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, // NULL); // // if(dlg.DoModal() == IDOK) // { // szFilename = dlg.GetPathName(); // ::MessageBox(NULL,szFilename,NULL,MB_OK); // } 注意:打开文件的方式和打开文件的方式是不同的。打开文件的方式是不断的打开直到出现末端为文件,否则遇到文件还要继续打开。而打开文件则是只要选择到一个路径的文件就打开。 下面的这种方式是打开文件MFC实现。 static TCHAR strDirName[MAX_PATH]; BROWSEINFO bi; CString szString = TEXT("选择一个源文件子文件"); bi.hwndOwner = ::GetFocus(); bi.pidlRoot = NULL; bi.pszDisplayName = strDirName; bi.lpszTitle = szString; bi.ulFlags = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; LPITEMIDLIST pItemIDList = ::SHBrowseForFolder(&bi); if(pItemIDList == NULL) { return ; } ::SHGetPathFromIDList(pItemIDList, strDirName); CString str = strDirName; if(str != "" && str.Right(1) != '//') str += '//'; ::SetDlgItemText(this->m_hWnd,IDC_EDIT1,str);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值