VC创建弹出式菜单

创建弹出式菜单

(一)实验目的:
     用户右击视窗时创建一个弹出式菜单

 

 

(二)实验内容:
     用CMenu::CreatePopupMenu() 和CMenu::TrackPopupMenu()创建弹出式菜单;并练习使用CMenu类的一些成员函数动态地修改菜单。

(三)实验步骤:

  实现弹出式菜单一般分四步:
   ·选择并用ClassWizard自动生成要使用的消息映射,例如鼠标右键消息映射;
   ·使用菜单资源或手工填充来创建一个弹出式菜单;
   ·显示弹出式菜单;
   ·加入菜单消息处理代码。

1、创建并填充一个弹出式菜单
  (1)用ClassWizard为类添加一个WM_RBUTTONDOWN消息处理函数,用于响应鼠标右键消息。
  (2)在该新处理函数中,创建一个CMenu类弹出式菜单对象。
    CMenu menu;
    menu.CreatePopupMenu();
  (3)添加一个菜单项到该菜单,可以用:
    menu.AppendMenu(0,IDC_WZD1_TYPE,"Wzd&1");
  (4)添加一个边上有复选标志的命令,用:
    menu.AppendMenu(MF_CHECKED,IDC_WZD2_TYPE,"Wzd&2");
  (5)在该弹出式菜单中放置一个分隔符,用:
    menu.AppendMenu(MF_SEPARATOR,0,"");
  (6)添加一个显示灰色和无效的命令,用:
    menu.AppendMenu(MF_GRAYED,IDC_WZD3_TYPE,"Wzd&3");
  (7)添加单选按钮到一组菜单项,可以用:
    menu.CheckMenuRadioItem(IDC_WZD3_TYPE, IDC_WZD4_TYPE, IDC_WZD4_TYPE, MF_BYCOMMAND);
     该函数的前两个变量是某个范围的命令ID的起始ID和结束ID;
     第三个变量是用户想在边上画点的菜单项。
     如果更喜欢用菜单位置,第四个变量可以用MF_BYPOSITION。
  (8)要使一个菜单项成为默认的菜单项,使用户按回车时被执行,可以用:
    ::SetMenuDefaultItem(menu.m_hMenu,IDC_WZD4_TYPE,MF_BYCOMMAND);
  注意:其中IDC_WZD1_TYPE,IDC_WZD2_TYPE,IDC_WZD3_TYPE,IDC_WZD4_TYPE是任意常数,它们分别代表每个菜单项对应的Resource ID

2、显示弹出式菜单
  (1)在鼠标右击处显示该弹出式菜单,用:
    CPoint pt;
    GetCursorPos(&pt);
    menu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
     应用程序暂停在TrackPopupMenu(),直到用户单击该菜单或其他地方。
     当菜单被单击时,一个WM_COMMAND消息与命令ID一起被发送到TrackPopupMenu()第四个变量指定的窗口。

  (2)使用TrackPopupMenu()以后,需要用DestroyMenu()销毁弹出式菜单对象。因为该例中的CMenu对象分配在堆栈中,返回时也将销毁它。
    menu.DestroyMenu();

3、用一个应用程序资源创建一个弹出式菜单
  若不想匆忙地创建一个弹出式菜单,也可以直接从应用程序资源中装入一个预定义的菜单。
  (1)用菜单编辑器创建一个新菜单,并给它添加所需的菜单项。
  (2)同前面一样,在堆栈中创建Menu类对象,但现在使用CMenu::LoadMenu( )从资源中装入新菜单。
    CMenu menu;
    menu.LoadMenu(IDR_WZD_MENU); // get menu resource
    CMenu*pPopup=menu.GetSubMenu(0); // get pointer to popup menu
  (3)禁用该弹出式菜单中的菜单项,用:
    pPopup->EnableMenuItem(ID_POPUP_WZD1,MF_BYCOMMAND|MF_GRAYED);
  (4)给菜单项添加一个复选标记,用:
    pPopup->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);
  (5)可以使用与前面一样的方法显示和销毁该弹出式菜单。
  注意:应该显示pPopup而不是menu

4、说明:
  (1)注意我们在这里处理两个对象:CMenu类对象和Windows弹出式菜单对象。
    可以认为CMenu对象是一个Windows资源的C++类封装;弹出式菜单对象实际上是一个用#32768作为它的窗口类的弹出式窗口。
    有关MFC对象和窗口对象参见MSDN。
  (2)注意正如一个普通菜单一样,从一个弹出式菜单中发送出来的消息是一个具有命令ID的WM_COMMAND消息。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC++项目中的菜单资源建立结构相同的自绘弹出式菜单,原理和步骤如下: (1)CMenu::LoadMenu读入菜单资源; (2)CImageList::Create读入工具栏位图; (3)CMenu::CreatePopupMenu和CMenu::AppendMenu拷贝菜单资源,建立弹出式菜单。其中CMenu::AppendMenu第1个参数设置成MF_OWNERDRAW(自绘), 第四个参数设置成一个附加结构的指针,包括菜单项文字和位图索引等信息。通过这个结构,在自绘制时,可以获取对应的菜单项文字和位图位置索引,其中位图保存在第(2)步中的CImageList变量中; (4)在对右鼠标键的响应函数里,使用CMenu::TrackPopupMenu启动显示弹出式菜单; (5)在弹出式菜单的拥有者窗口(CxxxView)里,处理WM_MEASUREITEM消息和WM_DRAWITEM消息,分别调用CMenuEx::MeasureItem和CMenuEx::DrawItem, 分别用来定义菜单项的尺寸,对菜单项进行自绘; (6)在自绘函数CMenuEx::DrawItem里,通过每个菜单项的附加结构lpDIS->itemData,获得其文字和位图索引,然后分别使用CDC::DrawText和CImageList::Draw,画出该菜单项的文字和位图,从而实现自绘制。 程序在VC6下编译通过。 没有处理的地方:如果菜单项状态是checked或者radio,程序没做处理。另外,弹出式菜单的激活/禁止时,不会自动触发其拥有者窗口的ON_UPDATE_COMMAND_UI宏。不过,可以处理owner窗口的WM_INITMEMUPOPUP消息(在弹出式菜单的每个子菜单弹出时,都会发出此消息),为每个子菜单项单独生成一个CCmdUI对象,调用其CCmdUI::DoUpdate函数,来手动触发ON_UPDATE_COMMAND_UI宏中对应的消息处理函数,使得菜单项能够根据应用环境进行激活和禁止。详见博客: http://oliver.zheng.blog.163.com/blog/static/14241159520143210595266/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值