让CListBox响应鼠标右键

为让CListBox类响应鼠标右键,需要从CListBox类派生出一个新类,如果使用代码自动生成的话可能会找不到父类为CListBox,没关系,即用CDialog好了,代码生成之后再改过来,不过会有几个小错误,根据错误提示,很容易改过来。一下是转载的:

在该派生类中添加一个WM_RBUTTONDOWN消息的响应函数,例如如下代码:

void newlist::OnRButtonDown(UINTnFlags, CPoint point)
{
// TODO: Add your message handler code here and/orcall default
MessageBox(_T(“Ok,响应鼠标右键!”));
CListBox::OnRButtonDown(nFlags,point);
}

以上这段代码是让整个listbox空间响应右键,为了只让listbox中的条目响应右击则需要更改为:

void newlist::OnRButtonDown(UINTnFlags, CPoint point)
{
// TODO: Add your message handler code here and/orcall default
int i = GetCurSel();
if(LB_ERR != i)
{
MessageBox(“ok”);
}
CListBox::OnRButtonDown(nFlags,point);
}

因为当listbox没有选中内容或多选时,GetCurSel函数返回LB_ERR,于是可以借由GetCurSel函数来实现只让listbox中的条目响应鼠标右击,而非整个控件。
P.S:一旦能够让listbox的内容响应右键,那么就可以对listbox的内容实现右键弹出菜单了,这正我想要的。下附右击listbox中的内容弹出菜单

void newlist::OnRButtonDown(UINTnFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
POINT curpoint;
GetCursorPos(&curpoint);
ScreenToClient(&curpoint);
RECT test;
int i = 0;
while(i<= GetCount())
{
GetItemRect(i, &test);
if (curpoint.y < test.bottom)
{
// 将当前右击项选中
SetCurSel(i);
// 加载弹出菜单
CMenu temp,*ptr;
temp.LoadMenu(IDR_MENU1);
ptr = temp.GetSubMenu(0);
ClientToScreen(&point);
ptr->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,point.x,point.y,GetParent());
break;
}
else
// 若之前选中了某项,而现在的右击又没有击中选项,则取消之前的选项
SetCurSel(-1);
i++;
}
CListBox::OnRButtonDown(nFlags,point);
}

发表评论

邮箱地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *