在應用程式中,往往要根據當前的操作來增加相應的選單。動態增加選單的方法有多
種,本文只講述利用資源編輯器預建立選單資源,然後在程式執行中動態加入(或刪
除)到主選單中去的方法。
在應用程式中,往往要根據當前的操作來增加相應的選單。動態增加選單的方法有多
除)到主選單中去的方法。
resourecview頁中右擊menu資源,加入乙個新的選單,其id為:idr_menu1。為
idr_menu1加入乙個選單項和相應的子選單。如(圖一)所示。
二、編輯idr_mainframe選單(id為idr_mainframe的選單一般均為主選單),在【檢視
(v)】選單項下面增加二個子選單項。如(圖二)所示。其屬性如下:
id caption
idc_add
加入選單
idc_delete
刪除選單
三、要訪問要選單,可使用cwnd類的getmenu()成員函式、或使用全域性函式
afxgetmainwnd()―>getmenu(),它們都返回乙個cmenu物件的指標。一旦得到cmenu指
針,就可以對選單進行各種操作(裝入、增加、插入,刪除,更新等等)。通過cmenu
指針對選單進行操作後,應使用cmenu類的detach()成員函式從cmenu物件中分離出菜
單,避免發生衝突。之後呼叫cwnd::drawmenubar()重畫選單。
四、為實現加入、刪除操作,我們用「classwizard」嚮導為idc_add和idc_delete增加
兩個command訊息對映函式,它們分別為cmainframe::onadd() 和
cmainframe::ondelete()。接著我們為其編寫**如下:
void cmainframe::onadd() //加入選單操作。
cmenu addmenu,*mainmenu;
if(!addmenu.loadmenu(idr_menu1)) //裝入選單資源。
messagebox("選單裝入失敗!","錯誤",mb_ok|mb_iconerror);
return; //如裝入失敗,顯示訊息框,且返回。
cstring str="顏色(&c)"; //要增加的選單項的標籤。
mainmenu=afxgetmainwnd()->getmenu();
//取得指向視窗選單的cmenu物件的指標。
mainmenu->insertmenu (1,mf_popup|mf_byposition|mf_string,
(uint)addmenu.getsubmenu(0)-> m_hmenu,str);
//將彈出式選單插入到第2項選單之前(選單項從0開始計算)。
// addmenu.getsubmenu(0)-> m_hmenu是被裝入選單的第乙個選單項的彈出式選單的選單控制代碼。
mainmenu->detach(); //將視窗選單與cmenu物件分離。
addmenu.detach(); //將資源選單(idr_menu1)與cmenu物件分離。
drawmenubar(); //重畫選單。
cmenu::insertmenu的函式原形如下:
bool insertmenu( uint nposition, uint nflags, uint nidnewitem = 0, lpctstr lpsznewitem = null );
引數 nposition:指定在那個選單項前插入新選單項。被引數nflags用於以下列方式解釋nposition
nflags引數
nposition引數的解釋
mf_bycommand
指定引數給出巳存在的選單項的命令id號。此為預設值。
mf_byposition
指定引數給出巳存在的選單項的位置。第一項位於位置0。如果nposition為-1,新選單將新增到選單尾。
引數 nflags:指定nposition、nidnewitem、lpsznewitem值如何被解釋。
引數 nidnewitem:指定新選單項的命令id號,或者,若nflags被設定為mf_popup,則指定為彈出選單的選單控制代碼(hmenu)。若nflags被設定為mf_separator,那麼引數nidnewitem將被忽略。
引數 lpsznewitem:指定新選單項的文字。被nflags以下列方式解釋
nflags引數
lpsznewitem的解釋
mf_string
包含指向以空格位終止符的字串指標。它為預設解釋。
mf_separator
引數將被忽略。
void cmainframe::ondelete() //刪除選單操作。
cmenu *m
ainmenu;
cstring str;
mainmenu=getmenu(); //取得指向視窗選單的cmenu物件的指標。
for(int i=mainmenu->getmenuitemcount()-1;i>=0;i--) //取得選單的項數。
mainmenu->getmenustring(i,str,mf_byposition);
//將指定選單項的標籤拷貝到指定的緩衝區。mf_byposition的解釋見上。
if(str=="顏色(&c)") //如果是剛才我們增加的選單項,則刪除。
mainmenu->deletemenu(i,mf_byposition);
break;
mainmenu->detach(); //將視窗選單與cmenu物件分離。
drawmenubar(); //重畫選單。
五、編譯,執行程式,看看到底是怎樣的!用這種方法動態增加選單有它的好處:即我們可以事先為選單id編寫好command、update_command_ui訊息對映入口,在程式需要時動態的裝入選單即可。
VC實現動態選單的建立方法
本文簡述了在程式不支援mfc,cmenu不可用的情況下,動態建立系統托盤選單的方法。由於選單項是不確定的,因而就需要用 sdk 建立乙個動態彈出選單。主要實現 如下 code begin 在類中定義的變數 雙擊托盤圖示時對應的選單項 id.uint m ndclickmenuitemid 彈出選單控...
VC動態生成選單項的實現方法
本例所述為使用vc編寫的乙個可以動態生成選單項的類檔案,這裡展示的是其核心 備有比較詳細的注釋,相對而言理解起來並不複雜。主要功能 如下 include stdafx.h include test.h include testdlg.h ifdef debug define new debug ne...
VC 的選單控制和自繪選單
選單控制 為什麼即使呼叫enablemenuitem選單項後,選單項還處於禁止狀態 需要將cframewnd m bautomenuenable設定為false,如果該資料成員為true 預設值 工作框將自動地禁止沒有on update command ui或者on command的選單項。disa...