這兩天遇見了如何讓CListBox的內(nèi)容響應(yīng)鼠標(biāo)右鍵的問題,沒有頭緒,Google了半天,基本上都是清一色的答復(fù):從clistbox派生一個(gè)類,且響應(yīng)WM_RBUTTONDOWN消息。但起初的實(shí)踐發(fā)現(xiàn),這種方法只是讓整個(gè)控件響應(yīng)右鍵,而我想要的是讓其內(nèi)容響應(yīng)。
后來才發(fā)現(xiàn)是我沒有領(lǐng)悟“答復(fù)”的真諦。
為讓CListBox類響應(yīng)鼠標(biāo)右鍵,需要從CListBox類派生出一個(gè)新類,且在該派生類中添加一個(gè)WM_RBUTTONDOWN消息的響應(yīng)函數(shù),例如如下代碼:
void newlist::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox(_T("Ok,響應(yīng)鼠標(biāo)右鍵!"));
CListBox::OnRButtonDown(nFlags, point);
}
以上這段代碼是讓整個(gè)listbox空間響應(yīng)右鍵,為了只讓listbox中的條目響應(yīng)右擊則需要更改為:
void newlist::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i = GetCurSel();
if(LB_ERR != i)
{
MessageBox("ok");
}
CListBox::OnRButtonDown(nFlags, point);
}
因?yàn)楫?dāng)listbox沒有選中內(nèi)容或多選時(shí),GetCurSel函數(shù)返回LB_ERR,于是可以借由GetCurSel函數(shù)來實(shí)現(xiàn)只讓listbox中的條目響應(yīng)鼠標(biāo)右擊,而非整個(gè)控件。
P.S: 一旦能夠讓listbox的內(nèi)容響應(yīng)右鍵,那么就可以對listbox的內(nèi)容實(shí)現(xiàn)右鍵彈出菜單了,這正我想要的。下附右擊listbox中的內(nèi)容彈出菜單
void newlist::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
POINT curpoint;
GetCursorPos(&curpoint);
ScreenToClient(&curpoint);
RECT test;
int i = 0;
while(i<= GetCount())
{
GetItemRect(i, &test);
if (curpoint.y < test.bottom)
{
// 將當(dāng)前右擊項(xiàng)選中
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
// 若之前選中了某項(xiàng),而現(xiàn)在的右擊又沒有擊中選項(xiàng),則取消之前的選項(xiàng)
SetCurSel(-1);
i++;
}
CListBox::OnRButtonDown(nFlags, point);
}
posted on 2009-11-30 02:54
zhaoyg 閱讀(3083)
評論(0) 編輯 收藏 引用 所屬分類:
MFC學(xué)習(xí)筆記