CoolTreeCtrl.cpp
上传用户:rxhxxy
上传日期:2007-01-02
资源大小:72k
文件大小:5k
源码类别:

TreeView控件

开发平台:

Visual C++

  1. //************************************************************************
  2. //
  3. // Filename : CoolTreeCtrl.cpp
  4. // Author : Rainer Pfitzner
  5. // Date : 11.10.1997
  6. // Purpose : Wrapper-Classes for New IE4.0 commctrl.dll: 
  7. //
  8. // Copyright (c) 1998 raip systems. All rights reserved
  9. //
  10. //************************************************************************
  11. #include "StdAfx.h"
  12. #include "CoolTreeCtrl.h"
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. IMPLEMENT_DYNAMIC(CCoolTreeCtrl, CWnd)
  19. BEGIN_MESSAGE_MAP(CCoolTreeCtrl, CWnd)
  20. //{{AFX_MSG_MAP(CCoolTreeCtrl)
  21. ON_WM_DESTROY()
  22. //}}AFX_MSG_MAP
  23. END_MESSAGE_MAP()
  24. CCoolTreeCtrl::CCoolTreeCtrl()
  25. {
  26. }
  27. CCoolTreeCtrl::~CCoolTreeCtrl()
  28. {
  29. DestroyWindow();
  30. }
  31. //////////////////////////
  32. // Create the CCoolTreeCtrl
  33. //
  34. BOOL CCoolTreeCtrl::Create(DWORD dwStyle, CRect rc, CWnd* pParentWnd, UINT nID)
  35. {
  36. ASSERT_VALID(pParentWnd);   // must have a parent
  37. CWnd* pWnd = this;
  38. // Initialize cool common controls
  39. static BOOL bInit = FALSE;
  40. if (!bInit) {
  41. INITCOMMONCONTROLSEX sex;
  42. sex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  43. sex.dwICC = ICC_TREEVIEW_CLASSES;
  44. InitCommonControlsEx(&sex);
  45. bInit = TRUE;
  46. }
  47. // Create the ListCtrl using style and parent.
  48. pWnd->CreateEx(NULL, WC_TREEVIEW, NULL, dwStyle, rc, 
  49. pParentWnd, nID);
  50. ASSERT(pWnd != NULL);
  51. return TRUE;
  52. }
  53. CString CCoolTreeCtrl::GetItemText(HTREEITEM hItem) const
  54. {
  55. ASSERT(::IsWindow(m_hWnd));
  56. TVITEM item;
  57. item.hItem = hItem;
  58. item.mask = TVIF_TEXT;
  59. CString str;
  60. int nLen = 128;
  61. int nRes;
  62. do
  63. {
  64. nLen *= 2;
  65. item.pszText = str.GetBufferSetLength(nLen);
  66. item.cchTextMax = nLen;
  67. ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
  68. nRes = lstrlen(item.pszText);
  69. } while (nRes == nLen-1);
  70. str.ReleaseBuffer();
  71. return str;
  72. }
  73. BOOL CCoolTreeCtrl::GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const
  74. {
  75. ASSERT(::IsWindow(m_hWnd));
  76. TVITEM item;
  77. item.hItem = hItem;
  78. item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE;
  79. BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
  80. if (bRes)
  81. {
  82. nImage = item.iImage;
  83. nSelectedImage = item.iSelectedImage;
  84. }
  85. return bRes;
  86. }
  87. UINT CCoolTreeCtrl::GetItemState(HTREEITEM hItem, UINT nStateMask) const
  88. {
  89. ASSERT(::IsWindow(m_hWnd));
  90. TVITEM item;
  91. item.hItem = hItem;
  92. item.mask = TVIF_STATE;
  93. item.stateMask = nStateMask;
  94. item.state = 0;
  95. VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
  96. return item.state;
  97. }
  98. DWORD CCoolTreeCtrl::GetItemData(HTREEITEM hItem) const
  99. {
  100. ASSERT(::IsWindow(m_hWnd));
  101. TVITEM item;
  102. item.hItem = hItem;
  103. item.mask = TVIF_PARAM;
  104. VERIFY(::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item));
  105. return (DWORD)item.lParam;
  106. }
  107. BOOL CCoolTreeCtrl::ItemHasChildren(HTREEITEM hItem) const
  108. {
  109. ASSERT(::IsWindow(m_hWnd));
  110. TVITEM item;
  111. item.hItem = hItem;
  112. item.mask = TVIF_CHILDREN;
  113. ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item);
  114. return item.cChildren;
  115. }
  116. BOOL CCoolTreeCtrl::SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage,
  117. int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam)
  118. {
  119. ASSERT(::IsWindow(m_hWnd));
  120. TVITEM item;
  121. item.hItem = hItem;
  122. item.mask = nMask;
  123. item.pszText = (LPTSTR) lpszItem;
  124. item.iImage = nImage;
  125. item.iSelectedImage = nSelectedImage;
  126. item.state = nState;
  127. item.stateMask = nStateMask;
  128. item.lParam = lParam;
  129. return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);
  130. }
  131. BOOL CCoolTreeCtrl::SetItemText(HTREEITEM hItem, LPCTSTR lpszText)
  132. {
  133.   ASSERT(::IsWindow(m_hWnd));
  134.   TVITEM item;
  135.   item.pszText = (LPTSTR) lpszText;
  136.   return (BOOL) ::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item);
  137. }
  138. HTREEITEM CCoolTreeCtrl::InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage,
  139. int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam,
  140. HTREEITEM hParent, HTREEITEM hInsertAfter)
  141. {
  142. ASSERT(::IsWindow(m_hWnd));
  143. TVINSERTSTRUCT tvis;
  144. tvis.hParent = hParent;
  145. tvis.hInsertAfter = hInsertAfter;
  146. tvis.item.mask = nMask;
  147. tvis.item.pszText = (LPTSTR) lpszItem;
  148. tvis.item.iImage = nImage;
  149. tvis.item.iSelectedImage = nSelectedImage;
  150. tvis.item.state = nState;
  151. tvis.item.stateMask = nStateMask;
  152. tvis.item.lParam = lParam;
  153. return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis);
  154. }
  155. HTREEITEM CCoolTreeCtrl::HitTest(CPoint pt, UINT* pFlags) const
  156. {
  157. ASSERT(::IsWindow(m_hWnd));
  158. TVHITTESTINFO hti;
  159. hti.pt = pt;
  160. HTREEITEM h = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0,
  161. (LPARAM)&hti);
  162. if (pFlags != NULL)
  163. *pFlags = hti.flags;
  164. return h;
  165. }
  166. void CCoolTreeCtrl::OnDestroy()
  167. {
  168. RemoveImageList(LVSIL_NORMAL);
  169. RemoveImageList(LVSIL_STATE);
  170. CWnd::OnDestroy();
  171. }
  172. void CCoolTreeCtrl::RemoveImageList(int nImageList)
  173. {
  174. HIMAGELIST h = (HIMAGELIST)SendMessage(TVM_GETIMAGELIST,
  175. (WPARAM)nImageList);
  176. if (CImageList::FromHandlePermanent(h) != NULL)
  177. SendMessage(TVM_SETIMAGELIST, (WPARAM)nImageList, NULL);
  178. }
  179. CImageList* CCoolTreeCtrl::CreateDragImage(HTREEITEM hItem)
  180. {
  181. ASSERT(::IsWindow(m_hWnd));
  182. HIMAGELIST hImageList = (HIMAGELIST)::SendMessage(m_hWnd,
  183. TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem);
  184. if (hImageList == NULL)
  185. return NULL;
  186. CImageList* pImageList = new CImageList;
  187. VERIFY(pImageList->Attach(hImageList));
  188. return pImageList;
  189. }