有關選單的操作主要用到
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...