2014-02-16 59 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()的消息映射中嗎?

如果這樣做沒有幫助,那麼當您逐步完成該功能時會發生什麼情況?

相關問題