大部分Windows應用程序都使用下拉式菜單實現自己特定的函數,它使編程更加方便,不需要在程序中增加多個按鈕以完成這些操作。大多數情況下,我們的程序編譯生成後,菜單就確定了,不能再修改。然而,在很多情況下,程序要根據用戶的自己設置產生不同的菜單以適應不同用戶的要求,這就需要我們動態的改變菜單。接下來我們就分析如何動態的生成不同的菜單。
第一步:
運行AppWizard生成一個工程mymenu,接受所有的默認設置,除了下面一步:在step 1中選Single Document ,點擊Finish按鈕,此時我們生成了一個工程。編譯運行,我們可以發現程序默認生成的菜單,接下來我們要對這個菜單進行修改。
第二步:
添加一個菜單資源,按如下步驟:菜單中選擇InsertàResouceàMenuàNew ,我們可以看到添加了一個ID號為IDR_MENU1的菜單資源,至於菜單中的各項你就隨便添加了,為了我們下面的編程,請你添加幾項,第一列要包含幾個子菜單。
第三步:
添加一個對話框資源,按如下步驟:菜單中選擇InsertàResouceàDialogàNew ,我們可以看到添加了一個ID號為IDD_DIALOG1的對話框資源,添加六個按鈕,如下圖:
ID號依次為ID_CLEAR, ID_GOONE ,ID_GOTWO, ID_ADD, ID_ADDITEM, ID_EDIT ,為對話框定義類名為CChangeMenu, 雙擊添加的六個按鈕增加處理函數,用默認函數名。
第四步:
在IDR_MAINFRAME菜單中添加一項,ID號為ID_SET,名為"彈出設置對話框",為其添加處理函數,添加如下代碼:
CChangeMenu dlg;
dlg.DoModal();
當然,別忘了在文件的開頭添加#include "changemenu . h"
第五步:
找到添加的六個按鈕的處理函數,依次添加如下的代碼:
void CChangeMenu::OnClear()
{
AfxGetMainWnd()->SetMenu(NULL);
AfxGetMainWnd()->DrawMenuBar();
}
void CChangeMenu::OnGoone()
{
if(!menu1){
menu1.LoadMenu(IDR_MENU1);
AfxGetMainWnd()->SetMenu(&menu1);
AfxGetMainWnd()->DrawMenuBar();
menu1.Detach();
}
}
void CChangeMenu::OnGotwo()
{
if(!menu2){
menu2.LoadMenu(IDR_MAINFRAME);
AfxGetMainWnd()->SetMenu(&menu2);
AfxGetMainWnd()->DrawMenuBar();
menu2.Detach();
}
}
void CChangeMenu::OnAdd()
{
static int x=400;
AfxGetMainWnd()->GetMenu()->AppendMenu(MF_STRING,x,"mynew");
AfxGetMainWnd()->DrawMenuBar();
x++;
}
void CChangeMenu::OnAdditem()
{
static int y=500;
AfxGetMainWnd()->GetMenu()->GetSubMenu(0)->InsertMenu(1,MF_BYPOSITION,y,"mynewitem");
AfxGetMainWnd()->DrawMenuBar();
y++;
}
void CChangeMenu::OnEdit()
{
AfxGetMainWnd()->GetMenu()->ModifyMenu(0,MF_BYPOSITION,402,"dfd");
AfxGetMainWnd()->DrawMenuBar();
}
好了,到這裡我們所有的功能就都實現了,快編譯運行一下吧!怎麼樣?還滿意嗎?