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


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

- 接下来进行代码编写,如下代码
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);
}
Comments