製作彈出式選單

2021-05-08 03:55:40 字數 2403 閱讀 6460

lonkil : 很老的一篇關於選單的文章,還是不錯的。發出來吧!

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

新建乙個選單資源,比如把選單的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所存的座標還原為相對於視窗客戶區的。

彈出式選單

彈出式選單 popmenu 大家都熟悉,在win98的桌面上單擊滑鼠右鍵彈出的選單就是彈出式選單。通常情況下,彈出式選單在滑鼠右鍵單擊時彈出,當然,也可以根據需要隨時彈出。在vc 5的mfc中,管理選單的類叫cmenu。下面我向大家介紹建立乙個彈出式選單的基本方法。一 在資源編輯器中建立乙個選單資源...

彈出式選單(PopMenu)

彈出式選單 popmenu 大家都熟悉,在win98的桌面上單擊滑鼠右鍵彈出的選單就是彈出式選單。通常情況下,彈出式選單在滑鼠右鍵單擊時彈出,當然,也可以根據需要隨時彈出。在vc 5的mfc中,管理選單的類叫cmenu。下面我向大家介紹建立乙個彈出式選單的基本方法。一 在資源編輯器中建立乙個選單資源...

建立彈出式選單

建立彈出式選單時,先建立乙個選單資源,然後呼叫loadmenu方法載入選單資源。bool loadmenu lpctstr lpszresourcename bool loadmenu uint nidresource 返回值 如果選單資源裝載成功,則返回非零值,否則為0。引數 lpszresour...