listview控件选中其中的某条记录右键单击后怎样弹出一个自定义的菜单?
有没有朋友做过?

解决方案 »

  1.   

    1..h文件中添加
       afx_msg void OnRclick(NMHDR* pNMHDR, LRESULT* pResult);2.cpp文件
    BEGIN_MESSAGE_MAP/BEGIN_MESSAGE_MAP之间添加
    ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)void CXXView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    CListCtrl* pList = &GetListCtrl();
    CPoint point;
    UINT Flags;
    ::GetCursorPos(&point);
    Flags = TVHT_ONITEM | TVHT_ABOVE  | TVHT_BELOW;
    pList->ScreenToClient(&point);
    int hitem = pList->HitTest(point,&Flags);
    if(hitem == -1)
    return;
    pList->ClientToScreen(&point);

    CString str;
    CMenu menu;
    menu.CreatePopupMenu();
    str.LoadString(IDS_STATUS_LOG_DELETE);
    menu.AppendMenu(MF_STRING,IDM_DELETE_STATUSLOG_BYITEM,str); menu.TrackPopupMenu(TPM_LEFTALIGN ,point.x,point.y,this); *pResult = 0;
    }
      

  2.   

    响应ListView的NM_RCLICK消息。在里面通过SubItemHitTest找到点击的Item。然后通过CMenu的LoadMenu,GetSubMenu,TrackPopupMenu等函数调用自定义的菜单。
      

  3.   

    void Dlg_OnNotify(HWND hwnd,WPARAM wParam,LPARAM lParam){
    HMENU hMenu;
    POINT point;
    hMenu = LoadMenu(g_hinst, MAKEINTRESOURCE(IDR_MONSETMENU));
    hMenu = GetSubMenu(hMenu, 0);
    switch((int)wParam)
    { case IDC_MSLIST: //获取与处理TabCtrl控件的通知消息 switch(code)
    {
    case NM_RCLICK:
                            //用 ListView_HitTest获取当前项的信息
    GetCursorPos(&point);
    SetForegroundWindow(hwnd); // 修正当用户按下ESCAPE 键或者在菜单之外单击鼠标时菜单不会消失的情况
    TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL);
    break;
    }
    break;
    }
    }
    INT_PTR WINAPI Dlg_Proc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ switch(uMsg)
    { case WM_NOTIFY:
    Dlg_OnNotify(hwnd,wParam,lParam);
    break;

    break;
    }

    return FALSE;
    }