2

以下のコードは、ウィンドウを作成し、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に入らないことです。私が間違っていることは何ですか?

4

1 に答える 1

2

API 関数GetParent()への引数として提供しています。TrackPopupMenuそのWM_COMMANDため、リスト ビュー自体ではなく、リスト ビューの親に送信されます。

リスト ビューに送信するか、親からリスト ビューにコマンドを転送します。Spy++ ツールを使用して、デバッグされたプロセスのメッセージをチェックし、正確に何がどこに送信されているかを確認することもできます。

于 2012-10-01T13:17:53.633 に答える