DirDialog.cpp
上传用户:fujunqh
上传日期:2021-05-10
资源大小:7090k
文件大小:4k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////
  2. // DirDialog.cpp: implementation of the CDirDialog class.
  3. //
  4. //////////////////////////////////////////////////////////////////////
  5. #include "stdafx.h"
  6. #include "DirDialog.h"
  7. #include "shlobj.h"
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13.         CString csStatusText;
  14. int __stdcall CDirDialog::BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
  15. {
  16.     CDirDialog* pDirDialogObj = (CDirDialog*)lpData;
  17.     if (uMsg == BFFM_INITIALIZED )
  18.     {
  19.         if( ! pDirDialogObj->m_strInitDir.IsEmpty() )
  20.             ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)(pDirDialogObj->m_strInitDir));
  21.         if( ! pDirDialogObj->m_strDlgTitle.IsEmpty() )
  22.            ::SetWindowText(hwnd, (LPCTSTR) pDirDialogObj->m_strDlgTitle);
  23.     }
  24.     else if( uMsg == BFFM_SELCHANGED )
  25.     {
  26.         LPITEMIDLIST pidl = (LPITEMIDLIST) lParam;
  27.         char selection[MAX_PATH];
  28.         if( ! ::SHGetPathFromIDList(pidl, selection) )
  29.             selection[0] = _T('');
  30.         BOOL bOk = pDirDialogObj->SelChanged(selection, csStatusText);
  31.         if( pDirDialogObj->m_bStatus )
  32.             ::SendMessage(hwnd, BFFM_SETSTATUSTEXT , 0, (LPARAM)(LPCSTR)selection);
  33.         ::SendMessage(hwnd, BFFM_ENABLEOK, 0, bOk);
  34.     }
  35.   return 0;
  36. }
  37. //////////////////////////////////////////////////////////////////////
  38. // Construction/Destruction
  39. //////////////////////////////////////////////////////////////////////
  40. CDirDialog::CDirDialog()
  41. {
  42. m_bStatus = FALSE ;
  43. }
  44. CDirDialog::~CDirDialog()
  45. {
  46. }
  47. //取得的路径名有路径标识符
  48. bool CDirDialog::DoBrowse(CWnd *pParent)
  49. {
  50.     m_strInitDir.TrimRight();
  51.     if( ! m_strInitDir.IsEmpty() )
  52.     {
  53.         if( m_strInitDir.Right(1) == _T("\") || m_strInitDir.Right(1) == _T("//") )
  54.             m_strInitDir = m_strInitDir.Left(m_strInitDir.GetLength() - 1);
  55. //correct selection "X:"
  56. if( m_strInitDir.Right(1) == _T(":"))
  57. m_strInitDir+=_T("\");
  58.     }
  59. bool bOK = false ;
  60. LPMALLOC pMalloc;
  61. if (SHGetMalloc (&pMalloc)!= NOERROR)
  62. {
  63. return bOK;
  64. }
  65. BROWSEINFO bInfo;
  66. LPITEMIDLIST pidl;
  67. ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));
  68. if (!m_strRootDir.IsEmpty ())
  69. {
  70. OLECHAR       olePath[MAX_PATH];
  71. ULONG         chEaten;
  72. ULONG         dwAttributes;
  73. HRESULT       hr;
  74. LPSHELLFOLDER pDesktopFolder;
  75. // 
  76. // Get a pointer to the Desktop's IShellFolder interface. 
  77. //
  78. if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
  79. {
  80. //
  81. // IShellFolder::ParseDisplayName requires the file name be in Unicode.
  82. //
  83. #ifndef _UNICODE
  84. MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_strRootDir.GetBuffer(MAX_PATH), -1,
  85. olePath, MAX_PATH);
  86. #else
  87. memcpy(olePath,m_strRootDir,m_strRootDir.GetLength() * sizeof(TCHAR)); 
  88. #endif
  89. m_strRootDir.ReleaseBuffer (-1);
  90. //
  91. // Convert the path to an ITEMIDLIST.
  92. //
  93. hr = pDesktopFolder->ParseDisplayName(NULL,
  94. NULL,
  95. olePath,
  96. &chEaten,
  97. &pidl,
  98. &dwAttributes);
  99. if (FAILED(hr))
  100. {
  101. pMalloc ->Free (pidl);
  102. pMalloc ->Release ();
  103. return bOK;
  104. }
  105. bInfo.pidlRoot = pidl;
  106. }
  107. }
  108. if(m_strTitle.IsEmpty())
  109. m_strTitle = _T("请选择目录");
  110. bInfo.hwndOwner = pParent->GetSafeHwnd() ;
  111. bInfo.pszDisplayName = m_strSelDir.GetBuffer (MAX_PATH);
  112. bInfo.lpszTitle = (LPCTSTR)m_strTitle;
  113. bInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS| (m_bStatus ? BIF_STATUSTEXT : 0);
  114. bInfo.lpfn = BrowseCtrlCallback;  // address of callback function
  115. bInfo.lParam = (LPARAM)this;      // pass address of object to callback function
  116. if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)
  117. {
  118. m_strSelDir.ReleaseBuffer();
  119. return bOK;
  120. }
  121. m_strSelDir.ReleaseBuffer();
  122.     m_iImageIndex = bInfo.iImage;
  123. bOK = (::SHGetPathFromIDList(pidl,m_strSelDir.GetBuffer(MAX_PATH)) == TRUE );
  124. m_strSelDir.ReleaseBuffer();
  125. pMalloc ->Free(pidl);
  126. pMalloc ->Release();
  127. if(bOK)
  128. {
  129. if(m_strSelDir.IsEmpty())
  130. m_strSelDir = _T('\');
  131. else if(m_strSelDir.Right(1) != _T('\') )
  132. m_strSelDir += _T('\');
  133. }
  134. return bOK;
  135. }
  136. BOOL CDirDialog::SelChanged(LPCSTR lpcsSelection, CString& csStatusText) 
  137. CString strPath(lpcsSelection);
  138. if(!strPath.IsEmpty())
  139. {
  140. if(m_bStatus)
  141. csStatusText = strPath ;
  142. return TRUE; 
  143. }
  144. else
  145. return FALSE; 
  146. };