大家好,這是我第一篇文章,就用我最常用的列表視圖做開始吧,我要做的功能就是在列表框上添加一個右鍵菜單,同時提示當前選中的文本內容,功能很簡單,而且是在別人的基礎上改編的,不過,一切事情都是從最簡單的事情開始的,“天下難事,必做於易;天下大事,必做於細”,況且,只有站在別人的肩膀上才能看的更遠,J,閒言少敘,書規正傳。
在codeproject網站中(http://www.codeproject.com/listctrl/drivebrowser.asp),Barretto VN的例子已經給出了一個用列表框顯示(具體的)驅動器的例子,所以現在要做的工作是了解與右鍵菜單相關的函數有那些,應該添加到那個位置。
使用彈出式菜單(PopMenu)
彈出式菜單(PopMenu)大家都熟悉,在WIN98的桌面上單擊鼠標右鍵彈出的菜單就是彈出式菜單。通常情況下,彈出式菜單在鼠標右鍵單擊時彈出,當然,也可以根據需要隨時彈出。 在VC++5的MFC中,管理菜單的類叫CMenu。下面我向大家介紹建立一個彈出式菜單的基本方法。
一、在資源編輯器中建立一個菜單資源
新建一個菜單資源,比如把菜單的ID號為IDC_POPMENU。此菜單有一項兩層,即有一個可彈出的菜單項,而此菜單項的彈出內容即為將要建立的彈出式菜單的內容。至於每一個菜單項的消息映射,與一般的菜單相同。
二、使用CMenu類對象
CMenu類的成員函數較多,但建立彈出式菜單只需用到其中幾個成員函數。
1、LoadMenu函數
功能:從應用程序的可執行文件中加載菜單資源
原型:BOOL LoadMenu( UINT nIDResource );
其中nIDResource是菜單資源的ID號,這裡用的是剛建立的IDC_POPMENU。
2、GetSubMenu函數
功能:此函數用於得到子菜單的指針。
原型:CMenu* GetSubMenu( int nPos ) const;
nPos為層數,0為第一層子菜單……以此類推。
由於我們需要的是“可彈出項”的第一層子菜單,因此用GetSubMenu(0)來得到第一層子菜單的類指針。
3、TrackPopupMenu函數
功能:在指定位置顯示彈出菜單,並跟蹤所選擇的項
原型:BOOL TrackPopupMenu( UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT
lpRect = NULL );
其中:
nFlags為屏幕坐標屬性和鼠標坐標屬性
屏幕坐標屬性:
TPM_CENTERALIGN 橫向將菜單以x居中
TPM_LEFTALIGN 橫向將菜單以x左對齊
TPM_RIGHTALIGN 橫向將菜單以x右對齊
鼠標按鍵屬性(只在響應WM_CONTEXTMENU消息時有效):
TPM_LEFTBUTTON 連續按? 右鍵不會連續彈出菜單,鼠標右鍵不可用於選定菜單項
TPM_RIGHTBUTTON 連續按鼠標右鍵會連續彈出菜單,鼠標右鍵可用於選定菜單項
x,y均為屏幕坐標
lpRect 菜單所占的區域。如果為NULL,當用戶在菜單以外的區域按鼠標鍵時,菜單會消失
三、具體實現方法
用ClassWizard中的“Add Windows Message Handler”功能添加對NM_RCLICKT消息的響應函數,函數中代碼如下,注釋很詳細,在vc6+win2000環境下調試成功,大家感興趣的話自己試試吧:
{
CListCtrl &CList = GetListCtrl();//獲取當前列表控件的指針
CMenu menu ,* pSubMenu;//定義下面要用到的cmenu對象
menu.LoadMenu(IDR_POPMENU);//裝載自定義的右鍵菜單
pSubMenu = menu.GetSubMenu(0);//獲取第一個彈出菜單,所以第一個菜單必須有子菜單
CPoint oPoint;//定義一個用於確定光標位置的位置
GetCursorPos( &oPoint);//獲取當前光標的位置,以便使得菜單可以跟隨光標
int istat=CList.GetSelectionMark();//用istat存放當前選定的是第幾項
CString pString =CList.GetItemText(istat,0);//獲取當前項中的數據,0代表是第0列
pString="您選擇的路徑是:"+pString ;//顯示當前選擇項
MessageBox(pString);//顯示當前選中的路徑
pSubMenu->TrackPopupMenu (TPM_LEFTALIGN, oPoint.x, oPoint.y, this); //在指定位置顯示彈出菜單
}