VC 動態加入和刪除選單的方法

2021-06-27 22:03:11 字數 2934 閱讀 8214

在應用程式中,往往要根據當前的操作來增加相應的選單。動態增加選單的方法有多 

種,本文只講述利用資源編輯器預建立選單資源,然後在程式執行中動態加入(或刪 

除)到主選單中去的方法。

在應用程式中,往往要根據當前的操作來增加相應的選單。動態增加選單的方法有多 

除)到主選單中去的方法。 

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