在CListCtrl中的一项的子项上单击鼠标右键,为何直接用WM_RBUTTONUP消息,确不响应此事件,而按住鼠标右键拖动项确可以响应此事件呢?

解决方案 »

  1.   

     右键点击CListCtrl的item弹出菜单
    添加CListCtrl控件的NM_RCLICK消息相应函数
    void CMyDlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)
    {
    NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;
    if(pNMListView->iItem!=-1)
    {
    DWORD dwPos = GetMessagePos();
    CPoint point( LOWORD(dwPos), HIWORD(dwPos) );
    CMenu menu;
    VERIFY( menu.LoadMenu( IDR_MENU1 ) );
    CMenu* popup = menu.GetSubMenu(0);
    ASSERT( popup != NULL );
    popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x, point.y, this );} 
    *pResult = 0;}你看看这个吧
      

  2.   


    CListCtrl从CWnd继承,那么消息处理过程就按照CWnd方式,在CWnd::OnWndMsg中。
    CWnd处理消息的顺序是:
    第一步判断这个消息是不是WM_COMMAND,如果是,则调用OnCommand,然后退出CWnd::OnWndMsg。
    如果不是,则判断是不是WM_NOTIFY,如果是,则调用OnNotify,然后退出CWnd::OnWndMsg.
    之后才会去判断例如WM_RBUTTONUP这样的消息。当你右键点击列表的时候,实际发送了一个通知消息WM_NOTIFY,跳过了WM_RBUTTONUP。
    而当拖动的时候,发送的不是WM_NOTIFY。