2014-02-16 3 views
0

Я ищу способ определить щелчок правой кнопкой мыши по заголовку списка ctrl для отображения контекстного меню. У меня есть пример кода, но он не работает.Как обрабатывать событие щелчка правой кнопкой мыши в заголовке ListCtrl?

void ExDialog::OnContextMenu(CWnd* pWnd, CPoint point) 
{ 
    CListCtrl* pLC = (CListCtrl*) GetDlgItem(IDC_EXAMPLE); 
    CHeaderCtrl* pHC = pLC->GetHeaderCtrl(); 
    if (pWnd->GetSafeHwnd()==pHC->GetSafeHwnd()) 
    { 
     CMenu menu; 
     VERIFY(menu.LoadMenu(IDR_HEADERMENU)); 
     CMenu* pPopup = menu.GetSubMenu(0); 
     ASSERT(pPopup != NULL); 
     CWnd* pWndPopupOwner = pHC; 
     pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner); 
    } 
} 
+0

ли это производный класс или непосредственно с помощью CListCtrl? –

ответ

1

Вы получаете контроль ListView там в качестве аргумента, то вам нужно найти заголовок оттуда сами: хит тестирования и/или сравнивающие координаты:

CListCtrl* pLC = (CListCtrl*) GetDlgItem(IDC_LIST1); 
CHeaderCtrl* pHC = pLC->GetHeaderCtrl(); 
if (pWnd->GetSafeHwnd() == pLC->GetSafeHwnd()) // <<--- Not pHC! 
{ 
    UINT nFlags = 0; 
    pLC->HitTest(point, &nFlags); 
    if(nFlags & LVHT_NOWHERE) // <<--- Header hits "nowhere" 
    { 
     CRect Position; 
     pHC->GetWindowRect(Position); 
     if(Position.PtInRect(point)) // <<--- point check 
     { 
      CMenu menu; 
      VERIFY(menu.LoadMenu(IDR_HEADERMENU)); 
      CMenu* pPopup = menu.GetSubMenu(0); 
      ASSERT(pPopup != NULL); 
      CWnd* pWndPopupOwner = pHC; 
      pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner); 
     } 
    } 
} 
0

Выглядит хорошо для меня. Забыли ли вы поместить ON_WM_CONTEXTMENU() в карту сообщений для ExDialog()?

Если это не поможет, что вы видите, когда вы проходите через эту функцию?

Смежные вопросы