如何動(dòng)態(tài)添加菜單/菜單項(xiàng)、子菜單、右鍵菜單
有關(guān)菜單的操作主要用到CMenu類,當(dāng)然也可用相應(yīng)API函數(shù),CMenu類只是MFC對(duì)API中操作菜單的函數(shù)的封裝而已。 不過能用類就盡量用類,類的組織方式好唄,代碼看著也舒服。 若是SDK編程,那就用API吧 。
CMenu ,menu1; //首先 定義CMenu對(duì)象
一、 創(chuàng)建菜單,有兩種方法
1. 用函數(shù)從資源加載
.(); //從資源加載,這里使用SDI的主菜單資源
2. 用函數(shù)創(chuàng)建
menu1.(); //創(chuàng)建菜單,還沒有菜單項(xiàng)
二、 添加菜單項(xiàng),可用()在菜單的最后加、()在指定的位置加.
// 在.h 中定義,隨便給個(gè)整數(shù)值,不要和已有的重復(fù)就行了
menu1.(,,"Test1"); // 第一項(xiàng)菜單項(xiàng)
menu1.(,,"Test2"); // 第二項(xiàng)菜單項(xiàng)
menu1.(1,|,
(UINT),""); // 在第二項(xiàng)菜單項(xiàng)前添加新菜單項(xiàng)
三、 添加子菜單
同樣用()、()函數(shù)。不過要注意參數(shù)的設(shè)置。
menu1.(||,
(UINT) .(0) ->,"子菜單");
//第二個(gè)參數(shù)是菜單的句柄HMENU
四、 刪除菜單
用()、()函數(shù)來刪除指定位置的菜單/菜單項(xiàng)。
兩者區(qū)別:如果菜單項(xiàng)是一個(gè)彈出式菜單,那么和之間的區(qū)別就很重要。清除彈出式菜單,但不清除它。一個(gè)是徹底的刪除,一個(gè)只是移除.
MSDN: 1.The the to the menu or and frees the used by the menu or . 它使菜單或者子菜單的無效()。
2. does not the menu or its , the menu to be . 可以再利用,并不從內(nèi)存中將menu刪除。
五、 添加右鍵菜單
CMenu menu1;
menu1.(); //動(dòng)態(tài)創(chuàng)建彈出式菜單對(duì)象
menu1.(,," 菜單項(xiàng)1");
menu1.(,," 菜單項(xiàng)2");
menu1.(2,||,
(UINT) .,"子菜單"); //添加子菜單
pt;
(&pt);
menu1.(, pt.x, pt.y, this);
menu1.();
六、 響應(yīng)菜單的事件
1. 若是資源中添加的菜單可用Class 添加菜單的響應(yīng)事件。
2. 若是通過代碼創(chuàng)建的菜單,要手工實(shí)現(xiàn)菜單的消息映射。本例是在類中,當(dāng)然也可在View類、Doc類中,基于對(duì)話框的同樣也可以。
1) 在.h文件中
// map
:
//{{()
int ( );
void (); //這里添加菜單命令處理函數(shù)的聲明
//}}
()
2) 在.cpp文件中,
(, )
//{{()
()
(, ) //這里添加,注意沒有’ ;’
//}}
()
void ::()
{
// 這里寫你要如何處理的代碼
……
}
其他方法:
若菜單ID值是連續(xù)的,最好用來映射消息處理函數(shù)mfc 在任意位置顯示菜單,可以在一個(gè)函數(shù)中處理一個(gè)范圍內(nèi)的所有消息。
當(dāng)用戶按下某個(gè)菜單項(xiàng)mfc 在任意位置顯示菜單,會(huì)發(fā)出一個(gè)消息,而菜單項(xiàng)的ID號(hào),就包含在參數(shù)的低位中.
BOOL ::( , )
{
// TODO: Add your code here and/or call the base class
UINT =();
if (==) //為你加入菜單項(xiàng)時(shí)指定的ID號(hào)
{
//在這里放入響應(yīng)的代碼
}
::(, );
}
對(duì)于右鍵菜單可以通過的返回值來處理。在參數(shù)中設(shè)置TPM_ ,這樣返回值就是你選擇的菜單項(xiàng)的ID,然后可以根據(jù)ID來處理。
(TPM_ ,pt.x,pt.y,this);
(關(guān)于函數(shù),這里有個(gè)地方需要注意一下,雖然MSDN里面沒有寫,但根據(jù)我的經(jīng)驗(yàn),TPM_ 值與
值一樣當(dāng)你添加了這個(gè)值之后,函數(shù)都不會(huì)再向消息響應(yīng)窗口發(fā)送(send) when the user on a menu item.需要你自己處理所有事件,或者你可以調(diào)用 或方法,將消息再發(fā)送給消息響應(yīng)窗口,例如:::(m_nid.hWnd, , , 0); //是的返回值,即發(fā)出消息的菜單項(xiàng)ID。) by YY
MSDN:If you in the , the value is the menu-item of the item that the user .
(
If this flag is set, the does not send when the user on a menu item.) by YY
七、 其他
() ; //當(dāng)您改變菜單時(shí),需要重畫菜單才能顯示所做的改變
() ; //取得窗口控制窗口
() //取得當(dāng)前程序使用的菜單
() //取得子菜單
應(yīng)使用CMenu類的()成員函數(shù)從Cmenu對(duì)象中分離出菜單句柄,避免對(duì)象失效后程序出錯(cuò)。
如:
CMenu menu;
menu.(); //動(dòng)態(tài)創(chuàng)建彈出式菜單對(duì)象
menu.(0,,"Test1");
menu.(0,,"Test2");
CMenu* = (); //取得程序主菜單 需在類中
->(||,(UINT)menu.,"子菜單1");
menu.(); //直接用menu.在運(yùn)行時(shí)出錯(cuò),menu對(duì)象在這個(gè)事件結(jié)束就銷毀了
();