ComboTreeCtrl.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // ComboTreeCtrl.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ComboTreeCtrl.h"
  5. #include "TreeComboBox.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CComboTreeCtrl
  13. CComboTreeCtrl::CComboTreeCtrl() :m_pCombo(NULL)
  14. {
  15. }
  16. CComboTreeCtrl::~CComboTreeCtrl()
  17. {
  18. }
  19. BEGIN_MESSAGE_MAP(CComboTreeCtrl, CTreeCtrl)
  20. ON_NOTIFY_REFLECT(NM_KILLFOCUS, OnKillfocus)
  21. ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
  22. ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
  23. ON_MESSAGE(TREECTRL_CHECK_STATE_CHANGE, OnTreeCtrlCheckStateChange)
  24. END_MESSAGE_MAP()
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CComboTreeCtrl message handlers
  27. void CComboTreeCtrl::Display(IN CRect rc)
  28. {
  29. if (GetSafeHwnd() == NULL)
  30. return;
  31. SetWindowPos(&wndNoTopMost, rc.left, rc.top, rc.right, rc.bottom, SWP_SHOWWINDOW);
  32. CWnd* pTopParent = GetParent()->GetParentOwner();
  33. if (pTopParent != NULL)
  34. {
  35. pTopParent->SendMessage(WM_NCACTIVATE, TRUE);
  36. pTopParent->SetRedraw(TRUE);
  37. }
  38. }
  39. BOOL CComboTreeCtrl::PreTranslateMessage(MSG* pMsg)
  40. {
  41. if (pMsg->hwnd != m_hWnd)
  42. return FALSE;
  43. // 过滤掉Alt+F4;
  44. if (WM_SYSKEYDOWN == pMsg->message && VK_F4 == pMsg->wParam)
  45. return TRUE;
  46. // 回车键和esc键关闭控件;
  47. if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE))
  48. {
  49. // WMU_CLOSE_CONTROL->关闭控件;
  50. ::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
  51. return TRUE;
  52. }
  53. return CTreeCtrl::PreTranslateMessage(pMsg);
  54. }
  55. void CComboTreeCtrl::OnKillfocus(NMHDR* pNMHDR, LRESULT* pResult)
  56. {
  57. // WMU_CLOSE_CONTROL->关闭控件;
  58. ::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
  59. }
  60. LRESULT CComboTreeCtrl::OnTreeCtrlCheckStateChange(WPARAM wParam, LPARAM lParam)
  61. {
  62. HTREEITEM hItemChanged = (HTREEITEM)lParam;
  63. BOOL bCheckState = GetCheck(hItemChanged);
  64. SelectItem(hItemChanged);
  65. while (hItemChanged = GetParentItem(hItemChanged))
  66. SetCheck(hItemChanged);
  67. return 1;
  68. }
  69. void CComboTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
  70. {
  71. UINT nFlags;
  72. HTREEITEM hItem;
  73. // verify that we have a mouse click in the check box area
  74. DWORD dwPos = GetMessagePos();
  75. CPoint point(LOWORD(dwPos), HIWORD(dwPos));
  76. ScreenToClient(&point);
  77. hItem = HitTest(point, &nFlags);
  78. if (hItem)
  79. {
  80. if (GetParentItem(hItem))
  81. ::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)hItem);// WMU_CLOSE_CONTROL->关闭控件;
  82. }
  83. *pResult = 0;
  84. }
  85. void CComboTreeCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
  86. {
  87. TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
  88. if (pTVKeyDown->wVKey == VK_SPACE)
  89. {
  90. HTREEITEM hItem = GetSelectedItem();
  91. if (hItem != NULL)
  92. {
  93. // handle state change here or post message to another handler
  94. // Post message state has changed
  95. PostMessage(TREECTRL_CHECK_STATE_CHANGE, 0, (LPARAM)hItem);
  96. }
  97. }
  98. *pResult = 0;
  99. }
  100. /************************************************************************/
  101. /* 函数:FindItem[12/7/2016 IT];
  102. /* 描述:从指定父项开始查找指定名称的项;
  103. /* 参数:;
  104. /* [IN] strName:要查找的项名称;
  105. /* [IN] hRoot:要开始查找的父项;
  106. /* 返回:void;
  107. /* 注意:;
  108. /* 示例:;
  109. /*
  110. /* 修改:;
  111. /* 日期:;
  112. /* 内容:;
  113. /************************************************************************/
  114. HTREEITEM CComboTreeCtrl::FindItem(IN const CString& strName, IN HTREEITEM hRoot)
  115. {
  116. // 判断父项是否就是要查找的项;
  117. CString sText = GetItemText(hRoot);
  118. if (sText.Compare(strName) == 0)
  119. return hRoot;
  120. HTREEITEM hItem = NULL;
  121. // 获取第一个子项句柄;
  122. HTREEITEM hSub = GetChildItem(hRoot);
  123. // 遍历所有子项;
  124. while (hSub)
  125. {
  126. // 当前子项是否是要查找的子项;
  127. if ((hItem = FindItem(strName, hSub)) != NULL)
  128. break;
  129. // 若未到,查找下一个兄弟项;
  130. hSub = GetNextSiblingItem(hSub);
  131. }
  132. return hItem;
  133. }