ReflectShellTree.cpp
上传用户:yangzi5763
上传日期:2007-01-02
资源大小:239k
文件大小:6k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. /************************************
  2.   REVISION LOG ENTRY
  3.   Revision By: Mihai Filimon
  4.   Revised on 11/7/98 10:21:58
  5.   Comments: ReflectShellTree.cpp: implementation of the CReflectShellTree class.
  6.  ************************************/
  7. #include "stdafx.h"
  8. #include "ControlsWnd.h"
  9. #include "XPropertiesWndCtl.h"
  10. #include "ReflectShellTree.h"
  11. #ifdef _DEBUG
  12. #undef THIS_FILE
  13. static char THIS_FILE[]=__FILE__;
  14. #define new DEBUG_NEW
  15. #endif
  16. //////////////////////////////////////////////////////////////////////
  17. // Construction/Destruction
  18. //////////////////////////////////////////////////////////////////////
  19. BEGIN_MESSAGE_MAP(CReflectShellTree, CShellTree)
  20. //{{AFX_MSG_MAP(CReflectShellTree)
  21. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  22. ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
  23. ON_WM_KILLFOCUS()
  24. ON_WM_LBUTTONUP()
  25. ON_WM_LBUTTONDOWN()
  26. ON_WM_KEYDOWN()
  27. //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CReflectShellTree message handlers
  31. // Function name : CReflectShellTree::CReflectShellTree
  32. // Description     : default constructor
  33. // Return type : 
  34. CReflectShellTree::CReflectShellTree()
  35. {
  36. m_nFlags = NOFLAG;
  37. m_pControlFolder = NULL;
  38. }
  39. // Function name : CReflectShellTree::~CReflectShellTree
  40. // Description     : virtual destrcutor
  41. // Return type : 
  42. CReflectShellTree::~CReflectShellTree()
  43. {
  44. }
  45. #define defaultStyles TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_HASBUTTONS
  46. #define defaultSize CSize(164,128) 
  47. // Function name : CReflectShellTree::CreatePopup
  48. // Description     : Create a popup window filled with shell folders
  49. // Return type : CReflectShellTree* 
  50. // Argument         : CControlsWnd_CShellFolder* pControlFolder
  51. // Argument         : FLAGS nFlags
  52. CReflectShellTree* CReflectShellTree::CreatePopup(CControlsWnd_CShellFolder* pControlFolder, FLAGS nFlags)
  53. {
  54. ASSERT(!IsWindow(GetSafeHwnd()));
  55.     CPoint p(0,0);
  56. if (!CWnd::CreateEx(WS_EX_TOOLWINDOW, _T("SysTreeView32"), _T(""), WS_BORDER | WS_POPUP | defaultStyles, 
  57.                         p.x, p.y, defaultSize.cx, defaultSize.cy, 
  58.                         pControlFolder->GetControl()->GetSafeHwnd(), 0, NULL))
  59.         return NULL;
  60. m_pControlFolder = pControlFolder;
  61. PopulateTree();
  62. EnableImages();
  63. m_nFlags = nFlags;
  64. if (IsCaptured())
  65. SetCapture();
  66. return this;
  67. }
  68. // Function name : CReflectShellTree::IsCaptured
  69. // Description     : 
  70. // Return type : BOOL 
  71. BOOL CReflectShellTree::IsCaptured()
  72. {
  73. return m_nFlags & STS_CAPTURE;
  74. }
  75. // Function name : CReflectShellTree::OnItemexpanding
  76. // Description     : Override the reflected message TVN_ITEMEXPANDING
  77. // Return type : void 
  78. // Argument         : NMHDR* pNMHDR
  79. // Argument         : LRESULT* pResult
  80. void CReflectShellTree::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
  81. {
  82. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  83. FolderExpanding(pNMHDR, pResult) ;
  84. *pResult = 0;
  85. }
  86. // Function name : CReflectShellTree::OnRclick
  87. // Description     : 
  88. // Return type : void 
  89. // Argument         : NMHDR* pNMHDR
  90. // Argument         : LRESULT* pResult
  91. void CReflectShellTree::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
  92. {
  93. if (!IsCaptured())
  94. FolderPopup(pNMHDR,pResult);
  95. *pResult = 0;
  96. }
  97. // Function name : CReflectShellTree::OnKillFocus
  98. // Description     : 
  99. // Return type : void 
  100. // Argument         : CWnd* pNewWnd
  101. void CReflectShellTree::OnKillFocus(CWnd* pNewWnd) 
  102. {
  103. if (IsCaptured())
  104. Out(TRUE);
  105. CShellTree::OnKillFocus(pNewWnd);
  106. }
  107. // Function name : CReflectShellTree::Out
  108. // Description     : 
  109. // Return type : void 
  110. // Argument         : BOOL bCancel
  111. void CReflectShellTree::Out(BOOL bCancel)
  112. {
  113. ASSERT (IsCaptured());
  114. ReleaseCapture();
  115. GetSelectedFolderPath(m_sSelectedPath);
  116. ShowWindow(SW_HIDE);
  117. // If this is not a cancel operation, notify...
  118. if (!bCancel)
  119. m_pControlFolder->OnDestroy();
  120. }
  121. // Function name : CReflectShellTree::OnLButtonDown
  122. // Description     : 
  123. // Return type : void 
  124. // Argument         : UINT nFlags
  125. // Argument         : CPoint point
  126. void CReflectShellTree::OnLButtonDown(UINT nFlags, CPoint point) 
  127. {
  128. if (IsCaptured())
  129. {
  130. CPoint p; GetCursorPos(&p);
  131. CRect rect; GetClientRect(rect);
  132. ClientToScreen(&rect);
  133. if (!rect.PtInRect(p))
  134. {
  135. LPARAM lParam = MAKELPARAM(p.x, p.y);
  136. ReleaseCapture();
  137. SendMessage(WM_NCLBUTTONDOWN,SendMessage(WM_NCHITTEST, 0, lParam), lParam);
  138. SetCapture();
  139. }
  140. }
  141. CShellTree::OnLButtonDown(nFlags, point);
  142. }
  143. // Function name : CReflectShellTree::OnLButtonUp
  144. // Description     : If user click outside 
  145. // Return type : void 
  146. // Argument         : UINT nFlags
  147. // Argument         : CPoint point
  148. void CReflectShellTree::OnLButtonUp(UINT nFlags, CPoint point) 
  149. {
  150. CShellTree::OnLButtonUp(nFlags, point);
  151. if (IsCaptured())
  152. {
  153. CPoint p = GetMessagePos();
  154. CRect rect; GetWindowRect(rect);
  155. if (!rect.PtInRect(p))
  156. Out();
  157. }
  158. }
  159. // Function name : CReflectShellTree::SetDefaultPath
  160. // Description     : 
  161. // Return type : void 
  162. // Argument         : LPCTSTR lpszPathName
  163. void CReflectShellTree::SetDefaultPath(LPCTSTR lpszPathName)
  164. {
  165. //not implemented yet
  166. }
  167. // Function name : CReflectShellTree::OnKeyDown
  168. // Description     : I will trap here the VK_ENTER key
  169. // Return type : void 
  170. // Argument         : UINT nChar
  171. // Argument         : UINT nRepCnt
  172. // Argument         : UINT nFlags
  173. void CReflectShellTree::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  174. {
  175. switch (nChar)
  176. {
  177. case VK_SPACE:
  178. case VK_RETURN:
  179. {
  180. Out();
  181. break;
  182. }
  183. }
  184. CShellTree::OnKeyDown(nChar, nRepCnt, nFlags);
  185. }