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...