BOOL CHallRoomDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
int menuID = LOWORD(wParam);
if(menuID == ID_USER_SENDMSG)
{
AfxMessageBox("ID_USER_SENDMSG!");
}
else if (menuID==ID_USER_YAOQING)
{
AfxMessageBox("ID_USER_YAOQING!");
}
else if (menuID==ID_USER_DETAIL)
{
AfxMessageBox("ID_USER_DETAIL!");
} return CDialog::OnCommand(wParam, lParam);
}鼠标点击菜单的时候,可以正常响应鼠标的信息,但是发现lParam为0我想请问下,能否在menu里面设置一下,就可以在lParam收到自己设置的数据这个功能可以实现吗,我就是想把lParam的参数利用起来

解决方案 »

  1.   

    在响应菜单点击的函数里,直接给窗口SendMessage,不就把lParam利用上了
      

  2.   

    lz想使用lParam来传递什么呢?
      

  3.   

    感觉楼主的意思是要在设计阶段给菜单项赋予一个data值,但是用来传递指针会有问题,动态内存的指针每次运行都可能变化,而全局的已初始化内存指针也可能在每次编译时发生改变,所以这么做很麻烦。为何不直接用 CommandId 来做区分呢,不同的ID就代表了不同的指令,该指令对应那个对象或什么数据是已知一一对应的,作个转换就可以了。
      

  4.   

    大家想一想为什么我需要这个实现主要是当你鼠标移动到listcontrol 上,点击右键,然后点菜单,单击菜单项,之后我在OnCommand  里面也只能收到这个菜单项的ID啊,那具体点击了哪一行,程序不知道所以我想把点击行的指针也传过来,就可以用了,否则需要定义个全局指针记录点击行指针
      

  5.   

    按楼主的设想,首先也需要在弹出菜单前获取点击行对象,这个无法避免,不过将该行对象保存在局部变量中即可,然后使用 TrackPopupMenu 显示菜单,设置 TPM_RETURNCMD 标志,则可以使用该局部变量对行对象进行操作。
      

  6.   


    void CHallRoomDlg::OnNMRclickListUsers(NMHDR *pNMHDR, LRESULT *pResult)
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    if(pNMListView->iItem != -1)
    {
    stRoomUserInfo*  lpUserInfo = (stRoomUserInfo*)m_listctlUsers.GetItemData(pNMListView->iItem); DWORD dwPos = GetMessagePos();
    CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
    CMenu   menu; 
    VERIFY(menu.LoadMenu   (IDR_POPUP_LIST)); 
    CMenu*   pPopup   =   menu.GetSubMenu(0);  if (lpUserInfo==m_pSelUserInfo)
    {
    pPopup->EnableMenuItem(ID_USER_SENDMSG, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    pPopup->EnableMenuItem(ID_USER_YAOQING, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
    }
    ASSERT(pPopup   !=   NULL); 
    pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this); 
    //pPopup->EnableMenuItem(ID_USER_SENDMSG,   MF_BYCOMMAND   |   MF_DISABLED)   ; 
    }
    *pResult = 0;
    }
    点击右键代码在此,如何修改
      

  7.   

    类似的东西我也做过
    菜单消息和listctrl应该属于同一窗体
    所以可以在菜单消息里获取当前选择项
    不用全局变量
    没什么啰嗦的
      

  8.   

    要不就自定义一个消息MYCOMMAND,在消息的处理中,处理完自己的事情然后再发送个COMMAND消息
    不知道这样行不行
      

  9.   

    void CHallRoomDlg::OnNMRclickListUsers(NMHDR *pNMHDR, LRESULT *pResult)
    {
        NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
        if(pNMListView->iItem != -1)
        {
            stRoomUserInfo*  lpUserInfo = (stRoomUserInfo*)m_listctlUsers.GetItemData(pNMListView->iItem);        DWORD dwPos = GetMessagePos();
            CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
            CMenu   menu; 
            VERIFY(menu.LoadMenu   (IDR_POPUP_LIST)); 
            CMenu*   pPopup   =   menu.GetSubMenu(0);         if (lpUserInfo==m_pSelUserInfo)
            {
                pPopup->EnableMenuItem(ID_USER_SENDMSG, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
                pPopup->EnableMenuItem(ID_USER_YAOQING, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
            }        
            ASSERT(pPopup   !=   NULL); 
            int menuID = pPopup->TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this); 
            //pPopup->EnableMenuItem(ID_USER_SENDMSG,   MF_BYCOMMAND   |   MF_DISABLED)   ; 
    if(menuID == ID_USER_SENDMSG)
    {
    AfxMessageBox("ID_USER_SENDMSG!");
    }
    else if (menuID==ID_USER_YAOQING)
    {
    AfxMessageBox("ID_USER_YAOQING!");
    }
    else if (menuID==ID_USER_DETAIL)
    {
    AfxMessageBox("ID_USER_DETAIL!");
    }

        }
        *pResult = 0;
    }
    //把OnCommand函数合并到到TrackPopupMenu下面
      

  10.   

    你想知道点击了CLsitCtrl中的哪一行,这个很简单啊,响应NM_CLICK消息不就行了
      

  11.   

    是单击后右键,选点菜单项我就是想通过lParam把当前点击行的指针传过去