XTBrowseDialog.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTBrowseDialog.cpp : implementation of the CXTBrowseDialog class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  22. #include "Common/XTPResourceManager.h"
  23. #include "Resource.h"
  24. #include "XTBrowseDialog.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[] = __FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. //////////////////////////////////////////////////////////////////////
  31. // Construction/Destruction
  32. //////////////////////////////////////////////////////////////////////
  33. CXTBrowseDialog::CXTBrowseDialog(CWnd* pParent/*= NULL*/)
  34. {
  35. // Initialize member data to 0.
  36. ::ZeroMemory((BROWSEINFO*)this, sizeof(BROWSEINFO));
  37. ::ZeroMemory(&m_szSelPath, sizeof(TCHAR));
  38. VERIFY(XTPResourceManager()->LoadString(&m_strTitle, XT_IDS_SELDIR));
  39. // Setup some defaults for the BROWSEINFO base members.
  40. SetOwner(pParent ? pParent->m_hWnd : NULL);
  41. SetPidlRoot(NULL);
  42. SetDisplayName(m_szSelPath);
  43. SetTitle((TCHAR*)(LPCTSTR)m_strTitle);
  44. SetOptions(BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE/*BIF_STATUSTEXT*/);
  45. SetCallback(BrowseCtrlCallback);
  46. SetData((LPARAM)this);
  47. }
  48. CXTBrowseDialog::~CXTBrowseDialog()
  49. {
  50. }
  51. int CALLBACK CXTBrowseDialog::BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
  52. {
  53. TCHAR szDir[MAX_PATH];
  54. ::ZeroMemory(&szDir, sizeof(TCHAR));
  55. switch (uMsg)
  56. {
  57. // Set the selected directory at startup.
  58. case BFFM_INITIALIZED:
  59. {
  60. // use previously selected path if availiable.
  61. CXTBrowseDialog* pBrowseDlg = (CXTBrowseDialog*)lpData;
  62. if (pBrowseDlg && _tcslen(pBrowseDlg->GetSelPath()) != 0)
  63. {
  64. STRCPY_S(szDir, MAX_PATH, pBrowseDlg->GetSelPath());
  65. }
  66. // if no path was availiable, try the current directory.
  67. if (_tcslen(szDir) == 0)
  68. {
  69. ::GetCurrentDirectory(_countof(szDir), szDir);
  70. }
  71. // set the directory path only if szDir is defined.
  72. if (_tcslen(szDir) != 0)
  73. {
  74. // wParam is TRUE since you are passing a path,
  75. // it would be FALSE if you were passing a pidl.
  76. ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDir);
  77. }
  78. }
  79. break;
  80. // Set the status window to the currently selected path.
  81. case BFFM_SELCHANGED:
  82. {
  83. CXTBrowseDialog* pBrowseDlg = (CXTBrowseDialog*)lpData;
  84. if (pBrowseDlg && (pBrowseDlg->ulFlags & BIF_STATUSTEXT) != 0)
  85. {
  86. if (::SHGetPathFromIDList((LPITEMIDLIST) lParam , szDir))
  87. {
  88. ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)szDir);
  89. }
  90. }
  91. }
  92. break;
  93. case BFFM_VALIDATEFAILED:
  94. break;
  95. default:
  96. break;
  97. }
  98. return 0;
  99. }
  100. INT_PTR CXTBrowseDialog::DoModal()
  101. {
  102. INT_PTR uReturn = IDCANCEL;
  103. LPMALLOC pMalloc = NULL;
  104. // Retrieve a pointer to the shell's IMalloc interface.
  105. if (::SHGetMalloc(&pMalloc) == NOERROR)
  106. {
  107. LPITEMIDLIST pItemIDList = SHBrowseForFolder(this);
  108. // Display the browse dialog box that enables the user to
  109. // select a shell folder.
  110. if (pItemIDList != NULL)
  111. {
  112. // Converts an item identifier list to a file system path,
  113. // this will be the path that the user has just selected.
  114. if (::SHGetPathFromIDList(pItemIDList, m_szSelPath))
  115. {
  116. uReturn = IDOK;
  117. }
  118. pMalloc->Free(pItemIDList);
  119. }
  120. pMalloc->Release();
  121. }
  122. return uReturn;
  123. }
  124. void CXTBrowseDialog::SetSelPath(LPCTSTR szSelPath)
  125. {
  126. STRCPY_S(m_szSelPath, MAX_PATH, szSelPath);
  127. }