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

对话框与窗口

开发平台:

Visual C++

  1. // MarkupTreeCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "markupsample.h"
  5. #include "MarkupTreeCtrl.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CMarkupTreeCtrl
  13. CMarkupTreeCtrl::CMarkupTreeCtrl()
  14. {
  15. }
  16. CMarkupTreeCtrl::~CMarkupTreeCtrl()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CMarkupTreeCtrl, CXTTreeCtrl)
  20. //{{AFX_MSG_MAP(CMarkupTreeCtrl)
  21. ON_NOTIFY_REFLECT(TVN_DELETEITEM, OnDeleteitem)
  22. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  23. ON_WM_LBUTTONDOWN()
  24. ON_WM_RBUTTONDOWN()
  25. ON_WM_LBUTTONDBLCLK()
  26. ON_WM_PAINT()
  27. //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CMarkupTreeCtrl message handlers
  31. HTREEITEM CMarkupTreeCtrl::AddItem(LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent/* = TVI_ROOT*/, HTREEITEM hInsertAfter/* = TVI_LAST*/)
  32. {
  33. CXTPMarkupUIElement* pUIElement = Parse(lpszItem);
  34. HTREEITEM hItem;
  35. if (pUIElement)
  36. {
  37. hItem = InsertItem(NULL, nImage, nSelectedImage, hParent, hInsertAfter);
  38. SetItemData(hItem, (DWORD_PTR)pUIElement);
  39. }
  40. else
  41. {
  42. hItem = InsertItem(lpszItem, nImage, nSelectedImage, hParent, hInsertAfter);
  43. }
  44. return hItem;
  45. }
  46. void CMarkupTreeCtrl::DrawMarkupItem(NMTVCUSTOMDRAW* lpLVCD)
  47. {
  48. HTREEITEM hItem = (HTREEITEM)lpLVCD->nmcd.dwItemSpec;
  49. CXTPMarkupUIElement* pUIElement = (CXTPMarkupUIElement*)lpLVCD->nmcd.lItemlParam;
  50. CRect rcItem(lpLVCD->nmcd.rc);
  51. SetDefaultTextColor(lpLVCD->clrText);
  52. SetDefaultFont((HFONT)SendMessage(WM_GETFONT));
  53. CXTPMarkupDrawingContext dc(lpLVCD->nmcd.hdc);
  54. pUIElement->Measure(&dc, CSize(INT_MAX, rcItem.Height()));
  55. CRect rcText;
  56. GetItemRect(hItem, rcText, TRUE);
  57. int x = rcText.left, y = rcItem.top;
  58. int cxMargin = GetSystemMetrics(SM_CXEDGE);
  59. CRect rcRect(x, y, x + cxMargin * 2 + pUIElement->GetDesiredSize().cx, y + rcItem.Height());
  60. CRect rcRender(CPoint(x + cxMargin, max(y, (rcItem.top + rcItem.bottom - pUIElement->GetDesiredSize().cy) / 2)), pUIElement->GetDesiredSize());
  61. ::SetBkColor(lpLVCD->nmcd.hdc, lpLVCD->clrTextBk);
  62. ::SetTextColor(lpLVCD->nmcd.hdc, lpLVCD->clrText);
  63. ::ExtTextOut(lpLVCD->nmcd.hdc, 0, 0, ETO_OPAQUE, rcRect, NULL, 0, NULL);
  64. if (lpLVCD->nmcd.uItemState & CDIS_FOCUS)
  65. {
  66. DrawFocusRect(lpLVCD->nmcd.hdc, &rcRect);
  67. }
  68. pUIElement->Arrange(rcRender);
  69. pUIElement->Render(&dc);
  70. }
  71. void CMarkupTreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  72. {
  73. NMTVCUSTOMDRAW* lpLVCD = reinterpret_cast<NMTVCUSTOMDRAW*>(pNMHDR);
  74. *pResult = CDRF_DODEFAULT;
  75. switch (lpLVCD->nmcd.dwDrawStage)
  76. {
  77. case CDDS_PREPAINT:
  78. *pResult = CDRF_NOTIFYITEMDRAW;
  79. break;
  80. case CDDS_PREPAINT | CDDS_ITEM:
  81. {
  82. HTREEITEM hItem = (HTREEITEM)lpLVCD->nmcd.dwItemSpec;
  83. if (lpLVCD->nmcd.lItemlParam != NULL)
  84. {
  85. *pResult |= CDRF_NOTIFYPOSTPAINT;
  86. }
  87. if (lpLVCD->clrTextBk == GetSysColor(COLOR_HIGHLIGHT))
  88. {
  89. lpLVCD->clrText = 0;
  90. lpLVCD->clrTextBk = 0xc9afa6;
  91. }
  92. break;
  93. }
  94. case CDDS_POSTPAINT | CDDS_ITEM:
  95. case CDDS_POSTPAINT | CDDS_ITEM  | CDDS_SUBITEM:
  96. {
  97. HTREEITEM hItem = (HTREEITEM)lpLVCD->nmcd.dwItemSpec;
  98. if (lpLVCD->nmcd.lItemlParam != NULL)
  99. {
  100. DrawMarkupItem(lpLVCD);
  101. }
  102. break;
  103. }
  104. }
  105. }
  106. void CMarkupTreeCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) 
  107. {
  108. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  109. // TODO: Add your control notification handler code here
  110. if (pNMTreeView->itemOld.lParam)
  111. {
  112. ((CXTPMarkupUIElement*)(pNMTreeView->itemOld.lParam))->Release();
  113. }
  114. *pResult = 0;
  115. }
  116. HTREEITEM CMarkupTreeCtrl::HitTestMarkupItem(CPoint point)
  117. {
  118. UINT nFlags;
  119. HTREEITEM hItem = HitTest(point, &nFlags);
  120. if (hItem && (nFlags & TVHT_ONITEMRIGHT))
  121. {
  122. CXTPMarkupUIElement* pElement = (CXTPMarkupUIElement*)GetItemData(hItem);
  123. if (!pElement)
  124. return NULL;
  125. if (pElement->GetFinalRect().PtInRect(point))
  126. return hItem;
  127. }
  128. return NULL;
  129. }
  130. void CMarkupTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  131. {
  132. HTREEITEM hItem = HitTestMarkupItem(point);
  133. if (hItem)
  134. {
  135. SelectItem(hItem);
  136. }
  137. CXTTreeCtrl::OnLButtonDown(nFlags, point);
  138. }
  139. void CMarkupTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
  140. {
  141. HTREEITEM hItem = HitTestMarkupItem(point);
  142. if (hItem)
  143. {
  144. SelectItem(hItem);
  145. return;
  146. }
  147. CXTTreeCtrl::OnRButtonDown(nFlags, point);
  148. }
  149. void CMarkupTreeCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
  150. {
  151. HTREEITEM hItem = HitTestMarkupItem(point);
  152. if (hItem)
  153. {
  154. Expand(hItem, TVE_TOGGLE);
  155. }
  156. CXTTreeCtrl::OnLButtonDblClk(nFlags, point);
  157. }
  158. void CMarkupTreeCtrl::OnPaint() 
  159. {
  160. CPaintDC dc(this); // device context for painting
  161. DoPaint(dc, FALSE);
  162. }