這兩天遇見了如何讓CListBox的內(nèi)容響應(yīng)鼠標(biāo)右鍵的問題,沒有頭緒,Google了半天,基本上都是清一色的答復(fù):從clistbox派生一個類,且響應(yīng)WM_RBUTTONDOWN消息。但起初的實踐發(fā)現(xiàn),這種方法只是讓整個控件響應(yīng)右鍵,而我想要的是讓其內(nèi)容響應(yīng)。
后來才發(fā)現(xiàn)是我沒有領(lǐng)悟“答復(fù)”的真諦。
為讓CListBox類響應(yīng)鼠標(biāo)右鍵,需要從CListBox類派生出一個新類,且在該派生類中添加一個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);
}
以上這段代碼是讓整個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);
}
因為當(dāng)listbox沒有選中內(nèi)容或多選時,GetCurSel函數(shù)返回LB_ERR,于是可以借由GetCurSel函數(shù)來實現(xiàn)只讓listbox中的條目響應(yīng)鼠標(biāo)右擊,而非整個控件。
P.S: 一旦能夠讓listbox的內(nèi)容響應(yīng)右鍵,那么就可以對listbox的內(nèi)容實現(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)前右擊項選中
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àn)在的右擊又沒有擊中選項,則取消之前的選項
SetCurSel(-1);
i++;
}
CListBox::OnRButtonDown(nFlags, point);
}
posted on 2009-11-30 02:54
zhaoyg 閱讀(3117)
評論(0) 編輯 收藏 引用 所屬分類:
MFC學(xué)習(xí)筆記