【发布时间】:2012-09-29 13:49:23
【问题描述】:
我创建了一个列表视图作为资源并加载到对话框窗口中。我只想在单击列表视图中的项目时检测并显示上下文菜单。
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?不是只针对 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。
-
哎呀,对不起,我被看起来像 ON_MESSAGE MFC 宏的 MESSAGE_HANDLER 宏误导了......并且您将问题标记为 MFC!然后你应该删除这个标签
-
好吧,你可以把责任推给我,我只是以为 MFC 的人一般都会知道 winapi。无论如何,删除它。
标签: winapi visual-c++ atl wtl