VC++深入详解 第6章 菜单

本文转载:http://blog.sina.com.cn/s/blog_3f56673a0100ajvk.html

第六章 菜单

6.1  菜单命令响应函数

      无

#资源ID号知识:

    以"IDM_"开头的是菜单资源

    以"IDC_"开头的是光标资源

    以"IDI_"开头的是图标资源

 

6.2  菜单命令的路由
6.2.1  程序类对菜单命令的响应顺序

        响应菜单项命令的顺序依次是:视类,文档类,框架类,应用程序类。


6.2.2  Windows消息的分类

        消息分为三类:

        1.标准消息:以WM_开头的消息。

        2.命令消息:来自菜单、工具栏的按钮、加速键的消息。

        3.通告消息:有控件产生的消息

        

        从CWnd派生的类,可以接收三类消息。

        从CCmdTarget派生的类,只能接收命令消息和通告消息。


6.2.3  菜单命令的路由

        消息的接收顺序和处理顺序是不同的。最先接收的是框架类。

       

        标准消息的处理函数是消息映射函数。

        命令消息的处理函数是 OnCommand函数。

        通告消息的处理函数是 OnNotify函数。


6.3  基本菜单操作
6.3.1  标记菜单

========================================================================

#CWin的成员函数知识:

     下面两个成员函数只需获得其对象的指针即可运行。

     1.获取程序的菜单栏。

       CMenu * GetMenu();        //返回菜单的指针

       在框架类中可以直接调用,因为该成员函数的对象就是框架类对象。

     2.获取一个菜单的子菜单。

       CMenu * GetSubMenu( int nPos )   //返回子菜单的指针

       可以用菜单的指针来调用。

========================================================================

        为菜单项添加一个标记的函数:

        UINT CheckMenuItem (索引号,索引方式);

        框架类下:

            GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);


6.3.2  默认菜单项

        框架类下:

            GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);

       

        一个子菜单只能有一个默认菜单项。

        分隔栏在子菜单中是占据索引位置的。


6.3.3  图形标记菜单

        为菜单项添加一图形标记:

        SetMenuItemBitmaps()

        框架类下:

          m_bitmap.LoadBitmap(IDB_BITMAP1); 

          GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap); 

 

        还需要知道图标的尺寸可以是多大。通过下面的函数可以获得:

        int GetSystemMetrics( int nIndex );

        当nIndex为SM_XMENUCHECK或SM_YMENUCHECK时,可以获得子菜单项目的尺寸


6.3.4  禁用菜单项

        设置菜单项的使用、禁用或变灰显示。

        EnableMenuItem();

        框架类下:

        GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED);

 

        还需要先把框架类成员变量m_bAutoMenuEnable变量设置为FALSE,才能更改菜单项目状态。


6.3.5  移除和装载菜单

        装载一个菜单:(需要将新菜单定义为CMainFrame的成员变量)

            CMenu menu;

            menu.LoadMenu(IDR_MAINFRAME);

            SetMenu(&menu);

        移除一个菜单:

            SetMenu(NULL)

 

#Detach函数

       Detach函数会把句柄与对象分离,当这个局部对象的生命周期结束时,它不会再去销毁这个对象


6.3.6  MFC菜单命令更新机制

        如果要在程序中设置某个菜单项的状态,首先通过ClassWiiard为这个菜单项添加UPDATE_COMMAND_UI消息响应函数,然后在这个函数中进行状态的设置即可。

 

        如果要把工具栏上的一个工具按纽与菜单栏中的某个菜单项相关联,只要将他们的ID设置为同一个就行。


6.3.7  快捷菜单

        单击鼠标右键显示的快捷菜单是一个ActiveX控件。它是位于VisualC++ Components目录下的"Pop-up Menu"组件。

        制作快捷菜单的步骤:

        1.插入ActiveX控件Pop-up Menu

        2.制作Pop-up Menu资源

        3.新建CMenu类

        4.调用ClientToScreen(&point)把客户区坐标转换为屏幕坐标

        5.调用CMenu类的成员函数TrackPopupMenu将快捷菜单显示出来

         
6.4  动态菜单操作
6.4.1  添加菜单项目

        CMenu的成员函数:AppendMenu可以把一个新菜单项目添加到一个指定菜单项目的末尾。

        代码如下:

        CMenu menu;

        menu.CreateMenu();

        GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");

        其中由于成员变量m_hMenu是HMENU类型的,而函数需要的是UINT类型的。但它们都是句柄,所以这

    里可以进行强制转换。


6.4.2  插入菜单项目

        CMenu的成员函数:InsertMenu()


6.4.3  删除菜单

       CMenu的成员函数:DeleteMenu()


6.4.4  动态添加的菜单项的命令响应

        步骤:

        1.在Resource.h文件中自定义一个资源ID: #define IDM_HELLO 111

        2.在Appendmenu中使用这个ID: menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");

        3.在框架类中添加函数原形: afx_msg void OnHello();

        4.消息映射表中天家消息映射:ON_COMMAND(IDM_HELLO,OnHello)

        5.实现消息响应函数

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值