WinApi,ATL创建上下文菜单函数处理程序
下面的代码创建了一个窗口,实现了CListViewCtrl,并尝试创建一个包含3个选项的上下文菜单:新建、编辑和删除WinApi,ATL创建上下文菜单函数处理程序,winapi,visual-c++,mfc,atl,Winapi,Visual C++,Mfc,Atl,下面的代码创建了一个窗口,实现了CListViewCtrl,并尝试创建一个包含3个选项的上下文菜单:新建、编辑和删除 class CGuiView : public CWindowImpl<CGuiView, CListViewCtrl> { HMENU hPopupMenu; MENUINFO m_ContextMenuInfo; public: DECLARE_WND_CLASS(NULL) BOOL PreTranslateMessage(M
class CGuiView : public CWindowImpl<CGuiView, CListViewCtrl>
{
HMENU hPopupMenu;
MENUINFO m_ContextMenuInfo;
public:
DECLARE_WND_CLASS(NULL)
BOOL PreTranslateMessage(MSG* pMsg)
{
pMsg;
return FALSE;
}
BEGIN_MSG_MAP(CGuiView)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
// MESSAGE_HANDLER(WM_LBUTTONUP,)
MSG_WM_CONTEXTMENU(OnContextMenu)
COMMAND_ID_HANDLER(ID_CTXMENU_NEW, OnNewTask)
END_MSG_MAP()
LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc(m_hWnd);
//TODO: Add your drawing code here
return 0;
}
void OnContextMenu ( HWND hwndCtrl, CPoint ptClick )
{
hPopupMenu = CreatePopupMenu();
InsertMenu(hPopupMenu, 0, MF_BYCOMMAND | MF_STRING, ID_CTXMENU_DELETE, TEXT("Delete"));
InsertMenu(hPopupMenu, ID_CTXMENU_DELETE, MF_BYCOMMAND | MF_STRING, ID_CTXMENU_EDIT, TEXT("Edit"));
InsertMenu(hPopupMenu, ID_CTXMENU_EDIT, MF_BYCOMMAND | MF_STRING | MF_ENABLED, ID_CTXMENU_NEW , TEXT("New"));
TrackPopupMenu(hPopupMenu, TPM_TOPALIGN | TPM_LEFTALIGN, ptClick.x, ptClick.y, 0,GetParent(), NULL);
}
LRESULT OnNewTask(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
CAboutDlg dlg;
dlg.DoModal();
return 0;
}
};
class CGuiView:public CWindowImpl
{
汉努大学;
MENUINFO m_ContextMenuInfo;
公众:
声明类(空)
BOOL预翻译信息(MSG*pMsg)
{
pMsg;
返回FALSE;
}
开始消息映射(CGuiView)
消息处理程序(WM\U PAINT、OnPaint)
//消息处理程序(WM_LBUTTONUP,)
MSG\U WM\U上下文菜单(OnContextMenu)
命令\u ID\u处理程序(ID\u CTXMENU\u新建,OnNewTask)
END_MSG_MAP()
LRESULT OnPaint(UINT/*uMsg*/,WPARAM/*WPARAM*/,LPARAM/*LPARAM*/,BOOL&/*bHandled*/)
{
CPaintDC dc(m_hWnd);
//TODO:在此处添加图形代码
返回0;
}
无效OnContextMenu(HWND hwndCtrl,CPoint ptClick)
{
hPopupMenu=CreatePopupMenu();
插入菜单(hPopupMenu,0,MF_BYCOMMAND | MF_STRING,ID_CTXMENU_DELETE,TEXT(“DELETE”);
插入菜单(hPopupMenu,ID_CTXMENU_DELETE,MF_BYCOMMAND | MF_STRING,ID_CTXMENU_EDIT,TEXT(“编辑”);
插入菜单(hPopupMenu,ID_CTXMENU_EDIT,MF_BYCOMMAND | MF_STRING | MF_ENABLED,ID_CTXMENU_NEW,TEXT(“新建”);
TrackPopupMenu(hPopupMenu,TPM_TOPALIGN | TPM_LEFTALIGN,ptClick.x,ptClick.y,0,GetParent(),NULL);
}
LRESULT OnNewTask(WORD/*wNotifyCode*/、WORD/*wID*/、HWND/*hWndCtl*/、BOOL&/*bHandled*/)
{
卡布特德;
dlg.DoModal();
返回0;
}
};
问题是,当我单击在OnContextMenu函数中创建的新菜单项时,上面的代码没有输入OnNewTask。我做错了什么?您提供了
GetParent()
作为TrackPopupMenu
API函数的参数。因此,WM_命令
被发送到列表视图父级,而不是列表视图本身
将其发送到列表视图,或将命令从父级转发到列表视图。您还可以使用Spy++工具检查调试过程中的消息,以查看发送的确切内容和位置