我创建了一个 ListView 作为资源并加载到对话框窗口上。我想仅在单击 ListView 中的项目时检测并显示上下文菜单。
MESSAGE_HANDLER(WM_CONTEXTMENU,OnContextMenu)
LRESULT OnContextMenu(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
int iSelected = -1;
int iFocusGroup = -1;
iSelected = SendMessage((HWND)wParam, LVM_GETNEXTITEM, -1,LVNI_SELECTED);
iFocusGroup = ListView_GetFocusedGroup((HWND)wParam);
if( iSelected != -1 && iFocusGroup == -1) {
hPopupMenu = CreatePopupMenu();
Insert
Menu(hPopupMenu, 0, MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, m_hWnd, NULL);
}
return 0;
}
好的,我已经编辑了这个,它的工作方式与此处呈现的方式相同,但问题仍然存在,有人可以向我解释一下焦点小组的情况是什么以及为什么如果我在对话框中发送 LVM_GETNEXTITEM 消息吗?返回!= -1 ?它不是仅适用于 ListView 吗?
编辑:
这是我根据您的回复制定的另一个替代方案:
LRESULT OnNotifyRClick(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
switch (uMsg)
{
case WM_NOTIFY:
switch (((LPNMHDR)lParam)->code)
{
case NM_RCLICK:
if (((LPNMHDR)lParam)->idFrom == IDC_LISTTASKFILES)
{
int iSelected = -1;
iSelected = SendMessage(GetDlgItem(IDC_LISTTASKFILES), LVM_GETNEXTITEM, -1,LVNI_SELECTED);
if( iSelected != -1 ) {
hPopupMenu = CreatePopupMenu();
InsertMenu(hPopupMenu, 0, MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_SHREDTASK_CTXMENU_DELETE, TEXT("Delete"));
TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, ((CPoint)GetMessagePos()).x, ((CPoint)GetMessagePos()).y, 0, m_hWnd, NULL);
}
bHandled = true;
return TRUE;
}
break;
break;
}
}
return false;
}
最佳答案
NM_RCLICK是你的 friend 。
但这并不能解决整个问题,例如当用户点击键盘上的 Windows 菜单键时显示上下文菜单。这个KB article显示如何组合 NM_RCLICK 和 WM_CONTEXTMENU。 (它适用于 CTreeCtrl,但将代码调整为 CListView 很简单)。
关于winapi - 检测在 ListView 内单击并显示上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12796501/