我正在寻找一种方法来确定右键单击列表 ctrl 的标题以显示上下文菜单。我有一个代码示例,但它不起作用。
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);
}
}
你在那里得到列表视图控件作为参数,然后你需要自己从那里找到标题: 命中测试和/或比较坐标:
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);
}
}
}
对我来说
看起来不错。您是否忘记将 ON_WM_CONTEXTMENU() 放入 ExDialog() 的消息映射中?
如果这没有帮助,那么当您逐步执行该函数时,您会看到会发生什么?