1. 菜单
菜单分为系统菜单(System Menu),下拉菜单(Pull-down Menu),弹出菜单(Pop-up Menu)
1)系统菜单
狭义系统菜单指单击窗口左上角图标弹出的菜单,功能是控制窗口的位置和大小,执行窗口最小化和最大化操作,关闭窗口等。广义的系统菜单包括狭义系统菜单,还包括窗口右上角的三个按钮项,即最小化,还原和关闭。
系统菜单的创建:1)在MFC的项目引导创建过程中,可以选择或者取消系统菜单。2)在主窗口创建函数OnCreate中,可以配置窗口风格,也可以在CMainFrame::PreCreateWindow函数中,配置或者取消系统菜单。
给系统菜单添加菜单项:在主菜单创建函数OnCreate中,通过下面的方式给系统菜单添加一条菜单项
(CMenu *)GetSystemMenu(FALSE)->AppendMenu(MF_STRING, IDS_LOCK, L"锁定窗口");
2)下拉菜单
单击菜单项会出现下拉式菜单选项列表,即为下拉菜单。下拉菜单包括主菜单和子菜单,允许有多层子菜单。
菜单项ID,在MFC资源Menu下添加一个菜单项,会分配一个菜单ID,菜单内的子菜单会有一个菜单项ID,有子菜单的菜单项不会赋予菜单项ID。菜单ID通过LoadMenu函数加载整个菜单,菜单项ID主要有两个作用,一是用来配合WM_COMMAND和消息响应函数关联起来。二是在项目->资源->加速器资源里面,通过菜单项ID给菜单项添加键盘加速键。
3)弹出菜单
依照鼠标指定的位置弹出的菜单,一般在窗口区单击右键弹出的菜单。
创建弹出菜单:首先在项目->资源->Menu下添加一个菜单表,菜单表中有主菜单和子菜单,子菜单就是用户所需要的弹出菜单。鼠标右键单击产生的弹出菜单消息WM_CONTEXTMENU<--->响应函数OnContextMenu,用该函数加载弹出菜单。
4)类CMenu
实现了菜单的定义及相关操作
重要的成员变量m_hMenu,指向附属于CMenu类对象的Windows菜单句柄
重要方法:
Bool CreateMenu();
创建一个初始化为空的菜单,通过AppendMenu/InsertMenu来添加菜单的条目
Bool LoadMenu(LPCTSTR lpszResourceName)
Bool LoadMenu(UINT nIDResource);
根据菜单唯一的名称或者ID从可执行文件中加载菜单资源
Bool DeleteMenu(UINT nPosition, UINT nFlags);
Bool TrackPoppMenu(UINT nFlags, int x, int y, CWnd *pWnd LPRECT lpRect = NULL);
DeleteMenu删除菜单中特定的条目
TrackPoppMenu在(x,y)位置显示弹出菜单
CMenu *GetSubMenu()const;
弹出菜单操作中使用的函数,它得到指向弹出菜单的指针
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
DrawItem自绘菜单形状改变时由应用程序框架调用
MeasureItem在自绘菜单创建时,由应用程序框架调用来得到菜单的大小
5)键盘加速键
键盘快捷键---Alt + 字符
键盘加速键---将击键同菜单项关联的方法,实现了将菜单项ID和按键组合对应起来。当用户在当前窗口按下键盘加速键,系统会发送消息WM_COMMAND通知应用程序,最终通过MFC消息映射表,调用消息响应函数进行消息处理。
2. 工具栏
工具栏可以看做图形化的菜单,是一种更有效,更快捷,更直观的命令输入方式。工具栏归属主框架窗口,其可以包含一组图形按钮或者其他控件。
1)控制栏
控制栏充当应用程序与用户交互的控件或者信息容器,为用户提供应用程序的直观操作与服务。工具栏和状态栏都属于控制栏。
类CControlBar是控制栏的基类,工具栏,状态栏和控制栏的类继承关系:
CObject
|----CCmdTarget
|------CWnd
|----CControlBar
|------CToolBar
|------CStatusBar
类CControlBar的常用方法:
void SetBarStyle(DWORD dwStyle); 指定控制栏的风格,比如,具有ToolTips功能等
void EnableDocking(DWORD dwStyle); 指定控制栏的停靠位置
2)工具栏和类CToolBar
工具栏是包含一行按钮的控制栏,按钮包括下压式按钮,复选框,单选按钮三种样式。
类CToolBar实现了带有位图按钮和可选分隔符的工具栏。
类CToolBar的常用方法:
Bool Create(CWnd *pParentWnd, DWORD dwStyle = WS_CHILD|WS_VISIBLE|CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR); 创建工具栏的基本函数,参数包括了父窗口,样式,和工具栏子窗口ID
LoadToolBar:为窗口载入指定的工具栏
LoadBitmap:为工具栏按钮载入指定的位图资源
3)工具栏的设计与应用
Visual C++为用户提供了工具栏资源:项目->资源->ToolBar。用户可以通过对应用程序默认工具栏进行修改或者新建工具栏资源获取所需的工具栏命令操作和风格。创建一个新的工具栏按钮,都会对应唯一的一个ID,和菜单命令映射类似,通过MFC消息映射机制把工具按钮的ID和命令消息响应函数关联起来。
工具提示(ToolTips),是指当光标移动到工具栏按钮上时,屏幕上会出现工具提示小窗口,窗口中是对该按钮的相关描述文字。工具提示是作为工具栏的风格实现配置或者取消。
3. 状态栏
状态栏位于主框架窗口底部,可细分为多个窗格的应用程序子窗口。状态栏既不能被用户输入也不产生命令消息,他的作用就是在应用程序的控制下在其各个窗格中显示一些提示信息。其中窗格分为信息行窗格和状态指示器窗格。
1)状态栏和类CStatusBar
在MFC中,状态栏的功能由类CStatusBar实现。类CStatusBar的常用方法:
Bool Create(CWnd *pParentWnd, DWORD dwStyle = WS_CHILD|WS_VISIBLE|CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR);
创建状态栏的基本函数,函数参数指定了状态栏的父窗口,样式和状态栏子窗口ID
Bool SetIndicators(const UINT *lpIDArray, int nIDCount);
在Create创建状态栏对象之后用来初始化工作,确定了状态栏的窗格,并同时赋予各个窗格字符串资源。lpIDArray指向窗格字符串数组的指针(字符串资源的ID的数组),nIDCount窗格数量。
void SetPaneStyle(int nIndex, UINT nStyle);
BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE);
void SetPaneInfo(int nIndex, UINT nID, UINT nStyle, int cxWidth);//设置指定的指示符窗格到新ID、样式和宽度。
参数nIndex是指示器窗格的索引
参数lpszNewText是窗格的显示文本
参数nID是指示器窗格的新ID
参数cxWidth指定了状态栏的宽度
参数nStyle指定了状态栏的风格
2)状态栏的设计与应用
在MFC应用程序的主架构窗口的实现文件中,用静态数据定义了状态栏:
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_INDICATOR_CAPS, // CAPS Lock
ID_INDICATOR_NUM, // NUMBER Lock
ID_INDICATOR_SCRL, // Scroll Lock
};
ID_SEPARATOR用来标识信息行窗格,而其他常量则是窗格所显示的字符串资源的ID。
创建一个自己的状态栏窗格:
A. 在工程项目的资源中的字符串资源表中添加一个新的字符串条目,比如:
ID_INDICATOR_TIMER 61446 00:00:00
B. 修改主框架窗口实现文件中的静态数组static UINT indicators[],将上一步中添加的字符串资源ID,添加到这个静态数组中。
C. 通过CStatusBar::SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_TIMER), str);更新自己的状态栏窗格。