WinApi,ATL创建上下文菜单函数处理程序



下面的代码创建一个窗口,实现CListViewCtrl并尝试创建一个包含3个选项的上下文菜单:新建,编辑和删除。

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;
    }
};

问题是,当我单击在 OnContextMenu 函数中创建的"新建"菜单项时,上面的代码没有进入 OnNewTask。我做错了什么?

您提供GetParent()作为TrackPopupMenu API函数的参数。因此,WM_COMMAND被发送到列表视图父级,而不是列表视图本身。

将其发送到列表视图,或将命令从父视图转发到列表视图。您还可以使用 Spy++ 工具检查调试过程中的消息,以查看究竟发送了什么以及发送到何处。

最新更新