| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | 
							
- #include "pch.h"
 
- #include "ComboTreeCtrl.h"
 
- #include "TreeComboBox.h"
 
- #ifdef _DEBUG
 
- #define new DEBUG_NEW
 
- #undef THIS_FILE
 
- static char THIS_FILE[] = __FILE__;
 
- #endif
 
- CComboTreeCtrl::CComboTreeCtrl() :m_pCombo(NULL)
 
- {
 
- }
 
- CComboTreeCtrl::~CComboTreeCtrl()
 
- {
 
- }
 
- BEGIN_MESSAGE_MAP(CComboTreeCtrl, CTreeCtrl)
 
- 	ON_NOTIFY_REFLECT(NM_KILLFOCUS, OnKillfocus)
 
- 	ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
 
- 	ON_NOTIFY_REFLECT(TVN_KEYDOWN, OnKeydown)
 
- 	ON_MESSAGE(TREECTRL_CHECK_STATE_CHANGE, OnTreeCtrlCheckStateChange)
 
- END_MESSAGE_MAP()
 
- void CComboTreeCtrl::Display(IN CRect rc)
 
- {
 
- 	if (GetSafeHwnd() == NULL)
 
- 		return;
 
- 	SetWindowPos(&wndNoTopMost, rc.left, rc.top, rc.right, rc.bottom, SWP_SHOWWINDOW);
 
- 	CWnd* pTopParent = GetParent()->GetParentOwner();
 
- 	if (pTopParent != NULL)
 
- 	{
 
- 		pTopParent->SendMessage(WM_NCACTIVATE, TRUE);
 
- 		pTopParent->SetRedraw(TRUE);
 
- 	}
 
- }
 
- BOOL CComboTreeCtrl::PreTranslateMessage(MSG* pMsg)
 
- {
 
- 	if (pMsg->hwnd != m_hWnd)
 
- 		return FALSE;
 
- 	
 
- 	if (WM_SYSKEYDOWN == pMsg->message && VK_F4 == pMsg->wParam)
 
- 		return TRUE;
 
- 	
 
- 	if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE))
 
- 	{
 
- 		
 
- 		::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
 
- 		return TRUE;
 
- 	}
 
- 	return CTreeCtrl::PreTranslateMessage(pMsg);
 
- }
 
- void CComboTreeCtrl::OnKillfocus(NMHDR* pNMHDR, LRESULT* pResult)
 
- {
 
- 	
 
- 	::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)0);
 
- }
 
- LRESULT CComboTreeCtrl::OnTreeCtrlCheckStateChange(WPARAM wParam, LPARAM lParam)
 
- {
 
- 	HTREEITEM hItemChanged = (HTREEITEM)lParam;
 
- 	BOOL bCheckState = GetCheck(hItemChanged);
 
- 	SelectItem(hItemChanged);
 
- 	while (hItemChanged = GetParentItem(hItemChanged))
 
- 		SetCheck(hItemChanged);
 
- 	return 1;
 
- }
 
- void CComboTreeCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
 
- {
 
- 	UINT nFlags;
 
- 	HTREEITEM hItem;
 
- 	
 
- 	DWORD dwPos = GetMessagePos();
 
- 	CPoint point(LOWORD(dwPos), HIWORD(dwPos));
 
- 	ScreenToClient(&point);
 
- 	hItem = HitTest(point, &nFlags);
 
- 	if (hItem)
 
- 	{
 
- 		if (GetParentItem(hItem))
 
- 			::PostMessage(m_pCombo->m_hWnd, WMU_CLOSE_CONTROL, (WPARAM)0, (LPARAM)hItem);
 
- 	}
 
- 	*pResult = 0;
 
- }
 
- void CComboTreeCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
 
- {
 
- 	TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR;
 
- 	if (pTVKeyDown->wVKey == VK_SPACE)
 
- 	{
 
- 		HTREEITEM hItem = GetSelectedItem();
 
- 		if (hItem != NULL)
 
- 		{
 
- 			
 
- 			
 
- 			PostMessage(TREECTRL_CHECK_STATE_CHANGE, 0, (LPARAM)hItem);
 
- 		}
 
- 	}
 
- 	*pResult = 0;
 
- }
 
- HTREEITEM CComboTreeCtrl::FindItem(IN const CString& strName, IN HTREEITEM hRoot)
 
- {
 
- 	
 
- 	CString sText = GetItemText(hRoot);
 
- 	if (sText.Compare(strName) == 0)
 
- 		return hRoot;
 
- 	HTREEITEM hItem = NULL;
 
- 	
 
- 	HTREEITEM hSub = GetChildItem(hRoot);
 
- 	
 
- 	while (hSub)
 
- 	{
 
- 		
 
- 		if ((hItem = FindItem(strName, hSub)) != NULL)
 
- 			break;
 
- 		
 
- 		hSub = GetNextSiblingItem(hSub);
 
- 	}
 
- 	return hItem;
 
- }
 
 
  |