| > |
谈在vc中动态改变菜单
大部分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();
}
好了,到这里我们所有的功能就都实现了,快编译运行一下吧!怎么样?还满意吗?