恩 ,大家好。我用的是VS2010,不會用CSDN的插入圖片的方法,大家表噴我。
這幾天在搞MFC,因爲客戶要求(TMD)所以只好搞一個右鍵菜單。這個在網上確實有許多的版本,但是大多語焉不詳,所以今天我特地把這個詳細的步驟寫出來,希望大家作爲參考。
創建右鍵菜單一共分三步。
第一步創建菜單資源:
1、在解決方案資源管理器裏面右鍵點擊“資源文件”,在”添加“項裏選擇“資源”,在選擇“Menu”,命名爲idc_menu1.
2、接下來在這個menu裏添加一個"刪除"項。這個太簡單了,我就不贅述了。
3、右鍵點擊“刪除”項選擇“添加事件處理程序”。把時間處理程序命名爲“m_Delete”。
代碼如下:
int spy_index;
spy_index=m_spy.GetCurSel();
if(spy_index==CB_ERR)
{
MessageBox("請選中一個記錄");
}
else
{
//刪除listbox 中的記錄
m_spy.DeleteString(spy_index);
}
這樣就成功的把菜單及其處理程序寫好了。
第二步,從CListBox類派生出一個新類,且在該派生類中添加一個WM_RBUTTONDOWN消息的響應函數:
1、派生類:
在類嚮導裏選擇“新建類”,選擇基類爲listbox。
新建了類以後需要自己寫一個消息響應函數
2、函數具體如下
afx_msg LRESULT m_list::OnRbuttondown(WPARAM wParam, LPARAM lParam)
{
POINT pt;
GetCursorPos(&pt);
int nCount = GetCount();
ScreenToClient(&pt);
//實現右鍵點擊選中目標
for (int i =0; i<nCount; i++)
{
bool a;
CRect rc;
GetItemRect(i, &rc);
if(rc.PtInRect(pt))
{
SetCurSel(i);
CMenu temp,*ptr;
temp.LoadMenu(IDR_MENU1);
ptr = temp.GetSubMenu(0);
ClientToScreen(&pt);
ptr->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,GetParent());
break;
}
}
這樣就做到了讓右鍵點擊一行並刪除的效果。
第三步,建立一個Listbox控件,並最終完成其刪除的功能
1、從工具欄建立一個listbox控件並且在類嚮導裏更改其基類,如下圖:
IDC_LIST2就是我創建的listbox控件。
綜合以上三步,我們就完成了這個Listbox右鍵的功能了。