程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 彈出式菜單

彈出式菜單

編輯:vc教程

彈出式菜單(PopMenu)大家都熟悉,在WIN98的桌面上單擊鼠標右鍵彈出的菜單就是彈出式菜單。通常情況下,彈出式菜單在鼠標右鍵單擊時彈出,當然,也可以根據需要隨時彈出。 在VC++5的MFC中,管理菜單的類叫CMenu。下面我向大家介紹建立一個彈出式菜單的基本方法。

一、在資源編輯器中建立一個菜單資源

  新建一個菜單資源,比如把菜單的ID號為IDC_POPMENU。此菜單有一項兩層,即有一個可彈出的菜單項,而此菜單項的彈出內容即為將要建立的彈出式菜單的內容。如右圖,“可彈出項”下的菜單即為將要建立的彈出式菜單的內容。實際上,“可彈出項”這個名稱在以後的操作中不會被用到,但VC++5不允許直接建立彈出式菜單,所以采用先建立“可彈出項”的方法。

至於每一個菜單項的消息映射,與一般的菜單相同。

二、使用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,當用戶在菜單以外的區域按鼠標鍵時,菜單會消失

三、實例

1、當鼠標右鍵單擊程序窗口的客戶區時,程序會收到一條WM_CONTEXTMENU消息,此時是彈出菜單的最好時機

  用ClassWizard中的“Add Windows Message Handler”功能添加對WM_CONTEXT消息的響應函數,函數中代碼如下:

void CMyDlg::OnContextMenu(CWnd* pWnd, CPoint point)

{

CMenu menu; //定義CMenu類對象
menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd);
/*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由於設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

}

2、在其他時候彈出菜單也可以,比如,可以響應WM_LBUTTONDOWN消息。這樣,在鼠標左鍵單擊時也能彈出菜單

  用ClassWizard中的“Add Windows Message Handler”功能添加對WM_LBUTTONDOWN消息的響應函數,函數中代碼如下:
void CMfc5Dlg::OnLButtonDown(UINT nFlags, CPoint point)

{

  CMenu menu; //定義CMenu類對象 menu.LoadMenu(IDC_POPMENU); //裝入剛建立的菜單IDC_POPMENU ClIEntToScreen(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
/*GetSubMenu(0)得到IDC_POPMENU的第一層子菜單,TrackPopupMenu將菜單彈出到(x,y)處。由於設置為TPM_LEFTALIGN,所以菜單以(x,y)為左上角。*/

ScreenToClIEnt(&point);
CDialog::OnLButtonDown(nFlags, point);

}

  注意:在WM_LBUTTONDOWN消息中得到的point對象所存的坐標是相對於窗口客戶區的,而TrackPopupMenu中的x,y需要是相對於屏幕的,所以需用ClientToScreen函數進行轉換,但此消息響應函數要調用CDialog::OnLButtonDown(nFlags, point),故應該用ScreenToClIEnt函數將point所存的坐標還原為相對於窗口客戶區的。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved