如何動態新增選單 選單項 子選單 右鍵選單

2021-06-05 17:38:01 字數 3933 閱讀 5841

有關選單的操作主要用到

cmenu

類,當然也可用相應

api函式,

cmenu

類只是mfc

對api

中操作選單的函式的封裝而已。

不過能用類就盡量用類,類的組織方式好唄,**看著也舒服。

若是sdk

程式設計,那就用

api吧。

cmenu menumain,menu1; //首先

定義cmenu物件

一、建立選單,有兩種方法

1.用loadmenu

函式從資源載入

menumain.loadmenu(idr_mainframe); //

從資源載入,這裡使用

sdi的主選單資源

2.用createmenu

函式建立

menu1.createmenu();   //

建立選單,還沒有選單項

二、新增選單項,可用

在選單的最後加、

insertmenu()

在指定的位置加.

// id_test1

在resource.h

中定義,隨便給個整數值,不要和已有的重複就行了

mf_string,id_test1,"test1"); //

第一項選單項

mf_string,id_test2,"test2"); //

第二項選單項

menu1.insertmenu(1,mf_byposition|mf_string,

(uint)id_test1,"id_test1"); //

在第二項選單項前新增新選單項

三、新增子選單

同樣用、insertmenu()

函式。不過要注意引數的設定。

|mf_string,

(uint) menumain.getsubmenu(0) ->m_hmenu,"子選單");

//第二個引數是選單的控制代碼hmenu

四、刪除選單

用deletemenu()、removemenu()函式來刪除指定位置的選單/選單項。

兩者區別:

如果選單項是乙個彈出式選單,那麼

deletemenu

和removemenu

之間的區別就很重要。

deletemenu

清除彈出式選單,但

removemenu

不清除它。乙個是徹底的刪除

,乙個只是移除.

msdn:  1.the   deletemenu   function   destroys   the   handle   to   the   menu   or   submenu   and   frees   the   memory   used   by   the   menu   or   submenu.      

它使選單或者子選單的

handle

無效(destroys)

。2.   removemenu   does   not   destroy   the   menu   or   its   handle,   allowing   the   menu   to   be   reused. 

可以再利用,並不從記憶體中將

menu

刪除。

五、新增

右鍵選單

cmenu menu1;

menu1.createpopupmenu();     //

動態建立彈出式選單物件

選單項1");

選單項2");

menu1.insertmenu(2,mf_byposition|mf_popup|mf_string,

(uint) menumain.m_hmenu,"

子選單"); //

新增子選單

六、響應

選單的事件

1.若是資源中新增的選單可用class wizard新增選單的響應事件。

2.若是通過**建立的選單,要手工實現選單的訊息對映。本例是在cmainframe類中,當然也可在view類、doc類中,基於對話方塊的同樣也可以。

1)在.h檔案中

// generated message map functions

protected:

//}afx_msg

declare_message_map()

2)在.cpp檔案中,

begin_message_map(cmainframe, cframewnd)

//}afx_msg_map

end_message_map()

void cmainframe::onchangmenuitem()

其他方法:

若選單id值是連續的,最好用on_command_range來對映訊息處理函式,可以在乙個函式中處理乙個範圍內的所有訊息。

當使用者按下某個選單項,會發出乙個wm_command訊息,而選單項的id號,就包含在引數wparam的低位中.  

bool   cyourview::oncommand(wparam   wparam,   lparam   lparam)

//  todo:   add your specialized code here and/or call the base class  

uint   m_nitemid=loword(wparam);  

if   (m_nitemid==id_youritem)  //id_youritem為你加入選單項時指定的id號

return   cscrollview::oncommand(wparam,   lparam);  

}   

對於右鍵選單可以通過trackpopupmenu的返回值來處理。在引數uflags中設定tpm_ returncmd,這樣返回值就是你選擇的選單項的id,然後可以根據id來處理。

trackpopupmenu(tpm_ returncmd ,pt.x,pt.y,this);

msdn:

if you specify tpm_returncmd in the uflags parameter, the return value is the menu-item identifier of the item that the user selected.

七、其他

drawmenubar () ; //當您改變選單時,需要重畫選單才能顯示所做的改變

getsystemmenu () ; //取得視窗控制視窗

getmenu()   //取得當前程式使用的選單

getsubmenu() //取得子選單

應使用cmenu

類的detach()

成員函式從

cmenu

物件中分離出選單控制代碼,避免物件失效後程式出錯。

如:cmenu menu;

menu.createpopupmenu(); //

動態建立彈出式選單物件

cmenu* menumain = getmenu(); //

取得程式主選單

需在cmainframe類中

子選單1"); 

menu.detach();      //

直接用menu.m_hmenu

在執行時出錯,

menu

物件在這個事件結束就銷毀了

drawmenubar();  

原文:

如何動態新增選單 選單項 子選單 右鍵選單

有關選單的操作主要用到 cmenu 類,當然也可用相應 api函式,cmenu 類只是mfc 對api 中操作選單的函式的封裝而已。不過能用類就盡量用類,類的組織方式好唄,看著也舒服。若是sdk 程式設計,那就用 api吧 cmenu menumain,menu1 首先 定義cmenu物件 一 建立...

如何動態新增選單 選單項 子選單 右鍵選單

有關選單的操作主要用到cmenu類,當然也可用相應api函式,cmenu類只是mfc對api中操作選單的函式的封裝而已。不過能用類就盡量用類,類的組織方式好唄,看著也舒服。若是sdk程式設計,那就用api吧 cmenu menumain,menu1 首先 定義cmenu物件 一 建立選單,有兩種方法...

如何向系統選單中動態新增選單項

1 什麼是系統選單?所謂系統選單就是指你在應用程式標題欄上滑鼠右鍵操作時彈出的選單,如下圖所示 2 如何在系統選單中動態新增選單項 修改系統選單 cmenu system menu system menu pfrm getsystemmenu false 正常檢視 n tf12 全螢幕檢視 f tf...