MFC学习笔记--菜单类CMenu和控件类CButton

8.3    菜单类
菜单允许用户用一种标准的方法与Windows应用程序进行交互:样式一致的用户界面对象----菜单栏。
位于窗口顶端的菜单栏是“顶层菜单”,单击时再出现的是下拉菜单,其中包含一个或多个“菜单项”。菜单可以分为下拉式和弹出式。
可以定义菜单的热键(在Caption属性字母前加&),可以定义菜单的快捷键。
菜单一般存在在资源脚本中,在程序运行时才调用。一个菜单项一般有两个必要的部分,他们分别是字符串名和整数标识符。一般来说,菜单的标识符ID在资源的头文件Resource.h中定义,例如:#define IDM_MENU1 129
8.3.2 菜单类的主要消息和方法
菜单类(CMenu)是从CObject类派生的。CMenu:public CObject
菜单类(CMenu)主要能发送两种消息:
    1.COMMAND: 菜单被单击时发送;
    2.UPDATE_COMMAND_UI: 菜单单击后的状态更新详细;(若菜单无消息,则显示为灰色)
菜单类(CMenu)的主要函数:
    Attach()            把一个标准的Windows菜单句柄附加到CMenu对象上
    CreateMenu()        创建一个空菜单并附加到CMenu对象上
    CreatePopupMenu()    创建一个弹出式菜单并把它附加到CMenu对象上
    DeleteTempMap()        删除由FromHandle()构造函数创建的任何临时CMenu对象
    DestroyMenu()        去掉附加到CMenu对象上的菜单并释放该菜单占有的任何内存
    Detach()            从CMenu对象上拆开Windows菜单句柄并返回该句柄
    FromHandle()        当给定Windows菜单句柄时,返回CMenu对象指针
    GetSafeHmenu()        返回由CMenu对象封装的菜单句柄成员(m_hMenu)
    LoadMenu()            从可执行文件装入菜单资源并把它附加到CMenu对象上
    LoadMenuIndirect()    从内存中的菜单模板中装入菜单并把它附加到CMenu对象上
    AppendMenu()        把一个新项加到给定的菜单末端
    InsertMenu()        在指定位置插入新的菜单项,把其它项向下移
8.3.3 菜单类的应用实例
创建菜单主要分为四步:菜单的设计、快捷键设计、菜单加载设计和处理代码编写。
    a.菜单的设计:
        1)资源视图中选择“添加资源”,在弹出的对话框中选择Menu增加新的菜单;
        2)添加一个菜单项,Caption修改为“C&alculate”,其右边和下边是一个带虚框的矩形框,可以继续添加菜单项。
    b.设置快捷键:
        设置Caption属性只能显示出快捷键说明,并不能运行时使用。只有在Accelerator资源中设定后,才是实现快捷键功能;
        选择“添加资源”----Accelerator----“新建”
        在CXXXDlg.h中定义一个成员变量HACCEL m_hAccel;
        在CXXXDlg.cpp的构造函数中进行初始化:m_hAccel = LoadAccelerators(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
        在CXXXDlg.cpp重载函数PreTranslateMessage:
        BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
        {
            if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST) 
            { 
                HACCEL hAccel = m_hAccel; 
                if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
                    return TRUE; 
            } 
            return CDialog::PreTranslateMessage(pMsg);
        }        
    c.加载并显示菜单:
        1)菜单实际上是一个对象,在具体编程中必须给它连接一个类;
        2)因为菜单将调用对话框中的一些成员函数,应该与对话框关联;
        3)修改对话框的Menu属性为菜单的ID:IDR_CALC_MENU,完成菜单对象加载到对话框的操作
    d.给菜单项编写代码:
        在子菜单上右击,选择“添加事件处理程序”。编写代码的方法:
            1.拷贝代码;
            2.直接调用按钮对应的函数;
            3.修改消息映射表,将菜单的响应直接映射到按钮函数;
            4.修改菜单ID为按钮ID;
            
8.5 按钮类CButton
按钮是一个矩形窗口,通常包含一个标题用来说明按钮的作用。CButton按钮控件类是从CWnd继承的。CObject-->CCmdTartget-->CWnd-->CButton.
按钮控件主要有命令按钮Button、单选按钮Radio Button 和复选框Check Box等。
    命令按钮Button            用来响应用户的鼠标点击操作;
    单选按钮Radio Button    由多个单选按钮组成一组,有选中和未选中两种状态,一组单选按钮是互斥的;
    复选框Check Box            一般也有选中和未选中两种状态;
8.5.2 按钮类的主要消息和方法
按钮类控件向父窗口发送的常用通知消息主要是单击消息BN_CLICKED和双击消息BN_DOUBLECLICKED;
CButton类的主要方法:
    CheckDlgButton()        设置按钮的状态;
    IsDlgButtonChecked()    返回指定复选框或单选按钮的状态
    CheckRadioButton()        选择组中的一个单选按钮;
    GetCheckedRadioButton()    获得一组单选按钮中被选中按钮的ID

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值