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