VC创建弹出式菜单

来源:互联网 发布:新浪微博认证淘宝店主 编辑:程序博客网 时间:2024/06/05 08:27

创建弹出式菜单

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

 

 

(二)实验内容:
     用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消息。

原创粉丝点击