트리 컨트롤에서 트리 아이템 위에서 마우스 오른쪽 버튼에 의한 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() 함수를 이용하여 마우스 포인터의 위치가 트리 아이템의 텍스트 영역에 있는지 판별하면 된다.