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

2021-06-18 19:40:29 字數 2754 閱讀 9503

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

cmenu menumain,menu1; //首先 定義cmenu物件

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

1.       用loadmenu函式從資源載入

menumain.loadmenu(idr_mainframe); //從資源載入,這裡使用sdi的主選單資源 

2.       用createmenu函式建立

menu1.createmenu();   //建立選單,還沒有選單項

// id_test1 在resource.h 中定義,隨便給個整數值,不要和已有的重複就行了

menu1.insertmenu(1,mf_byposition|mf_string,

(uint)id_test1,"id_test1"); // 在第二項選單項前新增新選單項

三、           新增子選單

|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刪除。

五、           新增右鍵選單

在view下新增wm_contextmenu,

oncontextmenu(cwnd* pwnd, cpoint point)

}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類中

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