blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理

  //dirdialog.h  
  ////////////////////////////////////////////////////////////////////////  
  //   DirDialog.h:   interface   for   the   CDirDialog   class.  
  //////////////////////////////////////////////////////////////////////  
   
  #if   !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)  
  #define   AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_  
   
  #if   _MSC_VER   >=   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >=   1000  
   
  class   CDirDialog  
  {  
  public:  
   
          CDirDialog();  
          virtual   ~CDirDialog();  
   
          BOOL   DoBrowse(CWnd   *pwndParent   =   NULL);  
   
          CString   m_strWindowTitle;  
          CString   m_strPath;  
          CString   m_strInitDir;  
          CString   m_strSelDir;  
          CString   m_strTitle;  
          int     m_iImageIndex;  
          BOOL   m_bStatus;  
   
  private:  
   
          virtual   BOOL   SelChanged(LPCSTR   /*   lpcsSelection   */,   CString&   /*   csStatusText   */)   {   return   TRUE;   };  
          static   int   __stdcall   CDirDialog::BrowseCtrlCallback(HWND   hwnd,   UINT   uMsg,   LPARAM   lParam,   LPARAM   lpData);  
  };  
   
  #endif   //   !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)   
   







//dirdialog.cpp  
   
  ///////////////////////////////////////////////////////////////////////////  
  //   DirDialog.cpp:   implementation   of   the   CDirDialog   class.  
  //////////////////////////////////////////////////////////////////////  
   
  #include   "stdafx.h"  
  #include   "DirDialog.h"  
  #include   "shlobj.h"  
   
  #ifdef   _DEBUG  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]=__FILE__;  
  #define   new   DEBUG_NEW  
  #endif  
   
  //   Callback   function   called   by   SHBrowseForFolder's   browse   control  
  //   after   initialization   and   when   selection   changes  
  int   __stdcall   CDirDialog::BrowseCtrlCallback(HWND   hwnd,   UINT   uMsg,   LPARAM   lParam,   LPARAM   lpData)  
  {  
          CDirDialog*   pDirDialogObj   =   (CDirDialog*)lpData;  
          if   (uMsg   ==   BFFM_INITIALIZED   )  
          {  
                  if(   !   pDirDialogObj->m_strSelDir.IsEmpty()   )  
                          ::SendMessage(hwnd,   BFFM_SETSELECTION,   TRUE,   (LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));  
                  if(   !   pDirDialogObj->m_strWindowTitle.IsEmpty()   )  
                          ::SetWindowText(hwnd,   (LPCTSTR)   pDirDialogObj->m_strWindowTitle);  
          }  
          else   if(   uMsg   ==   BFFM_SELCHANGED   )  
          {  
                  LPITEMIDLIST   pidl   =   (LPITEMIDLIST)   lParam;  
                  char   selection[MAX_PATH];  
                  if(   !   ::SHGetPathFromIDList(pidl,   selection)   )  
                          selection[0]   =   '\0';  
   
                  CString   csStatusText;  
                  BOOL   bOk   =   pDirDialogObj->SelChanged(selection,   csStatusText);  
   
                  if(   pDirDialogObj->m_bStatus   )  
                          ::SendMessage(hwnd,   BFFM_SETSTATUSTEXT   ,   0,   (LPARAM)(LPCSTR)csStatusText);  
   
                  ::SendMessage(hwnd,   BFFM_ENABLEOK,   0,   bOk);  
          }  
      return   0;  
  }  
   
  //////////////////////////////////////////////////////////////////////  
  //   Construction/Destruction  
  //////////////////////////////////////////////////////////////////////  
   
  CDirDialog::CDirDialog()  
  {  
  m_bStatus   =   FALSE;  
  }  
   
  CDirDialog::~CDirDialog()  
  {  
  }  
   
  BOOL   CDirDialog::DoBrowse(CWnd   *pwndParent)  
  {  
   
          if(   !   m_strSelDir.IsEmpty()   )  
          {  
                  m_strSelDir.TrimRight();  
                  if(   m_strSelDir.Right(1)   ==   "\\"   ||   m_strSelDir.Right(1)   ==   "//"   )  
                          m_strSelDir   =   m_strSelDir.Left(m_strSelDir.GetLength()   -   1);  
          }  
   
          LPMALLOC   pMalloc;  
          if   (SHGetMalloc   (&pMalloc)!=   NOERROR)  
                  return   FALSE;  
   
          BROWSEINFO   bInfo;  
          LPITEMIDLIST   pidl;  
          ZeroMemory   (   (PVOID)   &bInfo,sizeof   (BROWSEINFO));  
   
          if   (!m_strInitDir.IsEmpty   ())  
          {  
                  OLECHAR               olePath[MAX_PATH];  
                  ULONG                   chEaten;  
                  ULONG                   dwAttributes;  
                  HRESULT               hr;  
                  LPSHELLFOLDER   pDesktopFolder;  
                  //  
                  //   Get   a   pointer   to   the   Desktop's   IShellFolder   interface.  
                  //  
                  if   (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))  
                  {  
                          //  
                          //   IShellFolder::ParseDisplayName   requires   the   file   name   be   in   Unicode.  
                          //  
                          MultiByteToWideChar(CP_ACP,   MB_PRECOMPOSED,   m_strInitDir.GetBuffer(MAX_PATH),   -1,  
                                                                  olePath,   MAX_PATH);  
   
                          m_strInitDir.ReleaseBuffer   (-1);  
                          //  
                          //   Convert   the   path   to   an   ITEMIDLIST.  
                          //  
                          hr   =   pDesktopFolder->ParseDisplayName(NULL,  
                                                                                                  NULL,  
                                                                                                  olePath,  
                                                                                                  &chEaten,  
                                                                                                  &pidl,  
                                                                                                  &dwAttributes);  
                          if   (FAILED(hr))  
                          {  
                                  pMalloc   ->Free   (pidl);  
                                  pMalloc   ->Release   ();  
                                  return   FALSE;  
                          }  
                          bInfo.pidlRoot   =   pidl;  
   
                  }  
          }  
          bInfo.hwndOwner   =   pwndParent   ==   NULL   ?   NULL   :   pwndParent->GetSafeHwnd();  
          bInfo.pszDisplayName   =   m_strPath.GetBuffer   (MAX_PATH);  
          bInfo.lpszTitle   =   (m_strTitle.IsEmpty())   ?   "Open"   :   m_strTitle;  
          bInfo.ulFlags   =   BIF_RETURNFSANCESTORS  
                                          |   BIF_RETURNONLYFSDIRS  
                                          |   (m_bStatus   ?   BIF_STATUSTEXT   :   0);  
   
          bInfo.lpfn   =   BrowseCtrlCallback;     //   address   of   callback   function  
          bInfo.lParam   =   (LPARAM)this;             //   pass   address   of   object   to   callback   function  
   
          if   ((pidl   =   ::SHBrowseForFolder(&bInfo))   ==   NULL)  
          {  
                  return   FALSE;  
          }  
          m_strPath.ReleaseBuffer();  
          m_iImageIndex   =   bInfo.iImage;  
   
          if   (::SHGetPathFromIDList(pidl,   m_strPath.GetBuffer(MAX_PATH))   ==   FALSE)  
          {  
                  pMalloc   ->Free(pidl);  
                  pMalloc   ->Release();  
                  return   FALSE;  
          }  
   
          m_strPath.ReleaseBuffer();  
   
          pMalloc   ->Free(pidl);  
          pMalloc   ->Release();  
   
          return   TRUE;  
  }














//调用  
   
        CDirDialog   dlgDir;  
   
        dlgDir.m_strTitle   =   _T("Select   directory   for   file   search");  
        UpdateData(TRUE);  
        dlgDir.m_strSelDir   =   "C:\\";  
        dlgDir.m_strWindowTitle   =   _T("Select   directory");  
        if   (dlgDir.DoBrowse(this)   ==   IDOK)   {  
              m_Edit1   =   dlgDir.m_strPath;                     //将文件路径写到编辑控件中  
              //   Append   backslash   if   necessary  
              UpdateData(FALSE);  
        }   
 

 

 

 

 

 

 

 

 

//-------------------------------------------------------------------------------------------------------------------------
//另外一个方法:
BROWSEINFO   bi   =   {0};  
          LPITEMIDLIST   pidl;  
          IMalloc   *pMalloc   =   NULL;  
          char   cszPath[MAX_PATH];  
   
  bi.hwndOwner   =   m_hWnd;  
  bi.lpszTitle   =   "Title";  
  bi.ulFlags   =   BIF_RETURNONLYFSDIRS;  
  pidl   =   SHBrowseForFolder(&bi);  
  if   (pidl)  
  {  
  if   (SHGetPathFromIDList(pidl,   cszPath))  
  {  
   
          //   Get   Dir  
  }  
   
  if   (SHGetMalloc(&pMalloc))  
  {  
  pMalloc->Free(pidl);  
  pMalloc->Release();  
  }  
  }

posted on 2006-06-05 12:35  henry  阅读(1179)  评论(0编辑  收藏  举报