BrowseForFolder.cpp
上传用户:furain
上传日期:2007-01-04
资源大小:14k
文件大小:4k
源码类别:

Shell编程

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. //
  3. // ShellBrowser.cpp: implementation of the CShellBrowser class.
  4. //
  5. #include "stdafx.h"
  6. #include "BrowseForFolder.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. //
  14. // Construction/Destruction
  15. //
  16. CBrowseForFolder::CBrowseForFolder(const HWND hParent /*= NULL*/, const LPITEMIDLIST pidl /*= NULL*/, const int nTitleID /*= 0*/)
  17. {
  18. m_hwnd = NULL;
  19. SetOwner(hParent);
  20. SetRoot(pidl);
  21. SetTitle(nTitleID);
  22. m_bi.lpfn = BrowseCallbackProc;
  23. m_bi.lParam = reinterpret_cast<long>(this);
  24. m_bi.pszDisplayName = m_szSelected;
  25. }
  26. CBrowseForFolder::CBrowseForFolder(const HWND hParent, const LPITEMIDLIST pidl, const CString& strTitle)
  27. {
  28. m_hwnd = NULL;
  29. SetOwner(hParent);
  30. SetRoot(pidl);
  31. SetTitle(strTitle);
  32. m_bi.lpfn = BrowseCallbackProc;
  33. m_bi.lParam = reinterpret_cast<long>(this);
  34. m_bi.pszDisplayName = m_szSelected;
  35. }
  36. CBrowseForFolder::~CBrowseForFolder()
  37. {
  38. }
  39. //////////////////////////////////////////////////////////////////////
  40. //
  41. // Implementation
  42. //
  43. void CBrowseForFolder::SetOwner(const HWND hwndOwner)
  44. {
  45. if (m_hwnd != NULL)
  46. return;
  47. m_bi.hwndOwner = hwndOwner;
  48. }
  49. void CBrowseForFolder::SetRoot(const LPITEMIDLIST pidl)
  50. {
  51. if (m_hwnd != NULL)
  52. return;
  53. m_bi.pidlRoot = pidl;
  54. }
  55. CString CBrowseForFolder::GetTitle() const
  56. {
  57. return m_bi.lpszTitle;
  58. }
  59. void CBrowseForFolder::SetTitle(const CString& strTitle)
  60. {
  61. if (m_hwnd != NULL)
  62. return;
  63. m_pchTitle = std::auto_ptr<char>(new char [static_cast<size_t>(strTitle.GetLength()) + 1]);
  64. strcpy(m_pchTitle.get(), strTitle);
  65. m_bi.lpszTitle = m_pchTitle.get();
  66. }
  67. bool CBrowseForFolder::SetTitle(const int nTitle)
  68. {
  69. if (nTitle <= 0)
  70. return false;
  71. CString strTitle;
  72. if(!strTitle.LoadString(static_cast<size_t>(nTitle)))
  73. {
  74. return false;
  75. }
  76. SetTitle(strTitle);
  77. return true;
  78. }
  79. void CBrowseForFolder::SetFlags(const UINT ulFlags)
  80. {
  81. if (m_hwnd != NULL)
  82. return;
  83. m_bi.ulFlags = ulFlags;
  84. }
  85. CString CBrowseForFolder::GetSelectedFolder() const
  86. {
  87. return m_szSelected;
  88. }
  89. bool CBrowseForFolder::SelectFolder()
  90. {
  91. bool bRet = false;
  92. LPITEMIDLIST pidl;
  93. if ((pidl = ::SHBrowseForFolder(&m_bi)) != NULL)
  94. {
  95. m_strPath.Empty();
  96. if (SUCCEEDED(::SHGetPathFromIDList(pidl, m_szSelected)))
  97. {
  98. bRet = true;
  99. m_strPath = m_szSelected;
  100. }
  101. LPMALLOC pMalloc;
  102. //Retrieve a pointer to the shell's IMalloc interface
  103. if (SUCCEEDED(SHGetMalloc(&pMalloc)))
  104. {
  105. // free the PIDL that SHBrowseForFolder returned to us.
  106. pMalloc->Free(pidl);
  107. // release the shell's IMalloc interface
  108. (void)pMalloc->Release();
  109. }
  110. }
  111. m_hwnd = NULL;
  112. return bRet;
  113. }
  114. void CBrowseForFolder::OnInit() const
  115. {
  116. }
  117. void CBrowseForFolder::OnSelChanged(const LPITEMIDLIST pidl) const
  118. {
  119. (void)pidl;
  120. }
  121. void CBrowseForFolder::EnableOK(const bool bEnable) const
  122. {
  123. if (m_hwnd == NULL)
  124. return;
  125. (void)SendMessage(m_hwnd, BFFM_ENABLEOK, static_cast<WPARAM>(bEnable), NULL);
  126. }
  127. void CBrowseForFolder::SetSelection(const LPITEMIDLIST pidl) const
  128. {
  129. if (m_hwnd == NULL)
  130. return;
  131. (void)SendMessage(m_hwnd, BFFM_SETSELECTION, FALSE, reinterpret_cast<long>(pidl));
  132. }
  133. void CBrowseForFolder::SetSelection(const CString& strPath) const
  134. {
  135. if (m_hwnd == NULL)
  136. return;
  137. (void)SendMessage(m_hwnd, BFFM_SETSELECTION, TRUE, reinterpret_cast<long>(LPCTSTR(strPath)));
  138. }
  139. void CBrowseForFolder::SetStatusText(const CString& strText) const
  140. {
  141. if (m_hwnd == NULL)
  142. return;
  143. (void)SendMessage(m_hwnd, BFFM_SETSTATUSTEXT, NULL, reinterpret_cast<long>(LPCTSTR(strText)));
  144. }
  145. int __stdcall CBrowseForFolder::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
  146. {
  147. CBrowseForFolder* pbff = reinterpret_cast<CBrowseForFolder*>(lpData);
  148. pbff->m_hwnd = hwnd;
  149. if (uMsg == BFFM_INITIALIZED)
  150. pbff->OnInit();
  151. else if (uMsg == BFFM_SELCHANGED)
  152. pbff->OnSelChanged(reinterpret_cast<LPITEMIDLIST>(lParam));
  153. return 0;
  154. }