아이템 영역, 비 아이템 영역에 따른 마우스 오른쪽 버튼 Context 메뉴 출력


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