我有一个列表视图作为资源创建并加载到对话窗口。我只想在点击列表视图中的项目时检测并显示上下文菜单。检测内部列表视图和显示上下文菜单
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;
}
OK,我已经编辑这个和它的作品正是在这里呈现的方式,但问题仍然有效,并能有人向我解释什么是与焦点小组的东西在这里,为什么,如果我送而LVM_GETNEXTITEM消息在对话框中返回!= -1?这不仅仅是为了Listviews吗?
编辑:
这是基于您的回答,我已经制定了另一种选择:
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;
}
我不太明白:你把MFC和原始的WINAPI混合在一起。重点是什么?尝试首先保持一致:无论是所有的MFC还是所有的WINAPI,但是将两者混合并不是一个好主意。 –
我根本不使用MFC。我使用WTL和winapi。 –
哎呀,对不起,我误导了MESSAGE_HANDLER宏,它看起来像ON_MESSAGE MFC宏...并且通过将问题标记为MFC!你应该删除这个标签 –