1. 添加一个菜单资源,这里我们的菜单ID改为MN_LST,一定要有子菜单哦~
  2. 新建一个派生类,继承CListBox类,将我们需要弹出菜单的listbox类型改为我们新建的派生类。这里我们取名为CMyListBox

l0m6d6ui.png

l0m6e56c.png

  1. 对我们新建的派生类增加WM_RBUTTONUP消息

l0m6gmcr.png

  1. 接下来进行代码编写,如下代码
void CMyListBox::OnRButtonUp(UINT nFlags, CPoint point) {
 // 获取listbox总数,如果鼠标右键的地方有项目存在则获得该项目的下标
 int nIdx = -1;
 int nCount = GetCount();
 for (int i = 0; i < nCount; i++) {
     CRect rc;
     GetItemRect(i, &rc);
     if (rc.PtInRect(point)) {
         nIdx = i;
         break;
     }
 }

 // 如果上面的代码获得到listbox的item下标则会选中该item,否则取消选择
 SetCurSel(nIdx);

 // 弹出菜单
 CMenu menu;
 menu.LoadMenu(MN_LST);
 CMenu* popmenu;
 popmenu = menu.GetSubMenu(0);
 ClientToScreen(&point);
 // 此处的this->GetParent()决定谁来处理右键菜单点击的事件,这里我们交给父窗口进行处理此消息
 popmenu->TrackPopupMenu(TPM_RIGHTBUTTON, point.x, point.y, this->GetParent()); 

 CListBox::OnRButtonUp(nFlags, point);
}