谈在VC中动态改变菜单

设计漂亮实用的菜单
谈在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();
   }

  好了,到这里我们所有的功能就都实现了,快编译运行一下吧!怎么样?还满意吗
 
 
 
在菜单中增加位图或图标

 

MFC的CMenu类有一个成员函数SetMenuItemBitmaps,可以用于往菜单中增加图标。具体方法如下:

  在应用程序的资源文件中添加想要增加的位图,并将其ID命名为IDB_OPEN1和IDB_OPEN2;---在应用程序的视图类中添加CBitmap类的对象,不妨取名为bm_open1和bm_open2。在视图类的构造函数中添加以下代码:

  bm_open1.LoadBitmap(IDB_OPEN1);bm_open2.LoadBitmap(IDB_OPEN2);(函数LoadBitmap用于加载位图到CBitmap类的对象)在视图类的成员函数OnDraw()中添加以下代码:

  CWnd*parent=GetParent();CMenu*pmenubar=parent-$#@62;GetMenu();    

  CMenu*pmenu=pmenubar-$#@62;GetSubMenu(2);

  pmenu-$#@62;SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);

  前三行得到指向菜单的指针,第四行调用函数SetMenuItemBitmaps往菜单中增加图标,具体参数的含义可参见有关介绍MFC及其成员函数的书即可。

 

在系统菜单中加子菜单

系统菜单与其它菜单类似,你可以添加或删除项目,这需要使用CMenu 类的成员函数。下面的代码在你的系统菜单后面添加一个新菜单项:

CMenu *sysmenu;
sysmenu = m_pMainWnd->GetSystemMenu(FALSE);
sysmenu->AppendMenu(MF_STRING, 1000, "xxx");
参见MFC 帮助文件中的CMenu 类

 

  MFC的CMenu类有一个成员函数SetMenuItemBitmaps,可以用于往菜单中增加图标。具体方法如下:

  在应用程序的资源文件中添加想要增加的位图,并将其ID命名为IDB_OPEN1和IDB_OPEN2;---在应用程序的视图类中添加CBitmap类的对象,不妨取名为bm_open1和bm_open2。在视图类的构造函数中添加以下代码:

  bm_open1.LoadBitmap(IDB_OPEN1);bm_open2.LoadBitmap(IDB_OPEN2);(函数LoadBitmap用于加载位图到CBitmap类的对象)在视图类的成员函数OnDraw()中添加以下代码:

  CWnd*parent=GetParent();CMenu*pmenubar=parent-$#@62;GetMenu();    

  CMenu*pmenu=pmenubar-$#@62;GetSubMenu(2);

  pmenu-$#@62;SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);

  前三行得到指向菜单的指针,第四行调用函数SetMenuItemBitmaps往菜单中增加图标,具体参数的含义可参见有关介绍MFC及其成员函数的书即可。


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值