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

l0m6d6ui.png

l0m6e56c.png

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

l0m6gmcr.png

  1. 接下来进行代码编写,如下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}