刚学MFC,对消息映射一头雾水,在此提个幼儿园问题:用AppendMenu添加了一个ID为ID_MNUCOPY的菜单项并TrackPopupMenu出来;在XXXWinCpp类中添加消息映射:ON_COMMAND(ID_MNUCOPY,CXXXApp::OnMnuCopy),处理函数为:void CXXXApp::OnMnuCopy()
{    AfxMessageBox("COPY",MB_OK,0);    
}
但是为什么不能够响应呢?

解决方案 »

  1.   

    看你发消息的时候窗口句柄是否为你接受消息的句柄 ON_COMMAND(ID_MNUCOPY,CXXXApp::OnMnuCopy)
    这是响应系统的WM_COMMAND
    应该为
    #define WM_USERMESSAGE WM_USER+2 //自定义消息
    ON_MESSAGE(WM_USERMESSAGE,OnUserMessage)
    OnUserMessage为响应自定义消息处理函数
    ::SendMessage(hWnd,WM_USERMESSAGE,0, 0);
    发消息,hWnd为接受消息的窗体句柄
      

  2.   

    在CXXXApp类的头文件里定义消息函数:
    afx_msg void OnMnuCopy();
    在CXXXApp类的实现文件里:
    ON_COMMAND(ID_MNUCOPY, OnMnuCopy)
    void CXXXApp::OnMnuCopy()
    {
        AfxMessageBox("COPY",MB_OK,0);
    }
    当然ID_MNUCOPY应该已经定义好。楼上的讲的是自定义消息吧。
      

  3.   

    ID_MNUCOPY是定义好的,我这里没有自定义消息。
    我对MFC的消息映射还不懂,用手动的消息循环处理倒是做得出来,可为什么用MFC就做不对呢。
    如果我理解得不错的话,应该是点击菜单就会发出WM_COMMAND消息,然后参数中会包含发出消息的菜单ID,于是MFC就会将它的处理映射到OnMnuCopy中。那我觉得我这样应该没什么错呀。
    难道与ID_MNUCOPY定义的值有关?
      

  4.   

    你看看mfc中command消息的传递行程吧
      

  5.   

    你把消息映射和处理函数放到框架或者view类文件中试试你用的是应用程序类,可能接收不到菜单消息
      

  6.   

    TrackPopupMenu 
    的窗口为AfxGetMainWnd()吗?
    如果菜单在视图内弹出,使用this作为消息接受窗口,在CWinApp中将收不到消息,你将窗口改成主框架就可以了void CYourView::OnContextMenu( CWnd* pWnd, CPoint point)
    {
    CMenu menu;
    menu.LoadMenu(IDM_YOURMENU);
    CMenu* pSub = menu.GetSubMenu(0);
    if(pSub){
    pSub->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point,y, AfxGetMainWnd());
    }
    }