트리 컨트롤에서 트리 아이템 위에서 마우스 오른쪽 버튼에 의한 Context 메뉴 출력, 트리 아이템 영역이
아닌 곳에서 마우스 오른쪽 버튼에 의한 Context 메뉴 출력은 리스트 컨트롤과 크게 다르지 않다
참조) http://six605.tistory.com/302
하지만 리스트 컨트롤과 조금 다른 점이 있다면 아이템 영역이 어디까지 인가 하는 것이다.
아래와 같이 트리 컨트롤 아이템이 출력되어 있는 경우

"응용 프로그램" 트리 아이템의 영역은 그 라인 전체가 된다, 즉 가로길이 끝까지.

특정 경우에 "응용 프로그램" 위에서만 마우스 오른쪽 버튼에 의한 Context 메뉴를 출력 시키고 싶을 때가 있다.

void CLogTreeView::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult) { UNUSED_ALWAYS(pNMHDR); CPoint CurrentPosition; ::GetCursorPos(&CurrentPosition); CTreeCtrl &TreeCtrl = GetTreeCtrl(); TreeCtrl.ScreenToClient(&CurrentPosition); m_hTreeItem = TreeCtrl.HitTest(CurrentPosition); if (NULL == m_hTreeItem) return; CRect rect; TreeCtrl.GetItemRect(m_hTreeItem, &rect, TRUE); if (!rect.PtInRect(CurrentPosition)) return; m_sMouseRPopupLogName = TreeCtrl.GetItemText(m_hTreeItem); ::GetCursorPos(&CurrentPosition); CMenu MenuTemp; CMenu *pContextMenu = NULL; MenuTemp.LoadMenu(IDR_MENU_LOGTREE); pContextMenu = MenuTemp.GetSubMenu(0); pContextMenu->TrackPopupMenu(TPM_LEFTALIGN, CurrentPosition.x, CurrentPosition.y, ::AfxGetMainWnd()); *pResult = 0; }
소스 코드의 16 ~ 19 라인의 코드 처럼
CTreeCtrl::GetItemRect() 함수로 텍스트 영역만 얻고자 하는 트리 아이템 핸들을 전달한다.
그런 다음 CRect::PtInRect() 함수를 이용하여 마우스 포인터의 위치가 트리 아이템의 텍스트 영역에 있는지 판별하면 된다.
댓글 없음:
댓글 쓰기