550 likes | 659 Views
菜单、工具栏和状态栏是 Windows 不可或缺的界面元素。其中,菜单和工具栏提供了用户传递命令的界面,状态栏提供了一个输出区域。 本章主要介绍以下内容: ( 1 )菜单。 ( 2 )工具栏。 ( 3 )状态栏。. 3.1 菜单. 重点介绍: 菜单类型 创建菜单 菜单设计 菜单程序 键盘快捷键. 3.1.1 菜单类型. 菜单是用户与程序交互的一个非常重要的元素,使用菜单方便了用户的操作。 Windows 的菜单分为两种类型: 固定菜单:是固定在菜单栏上的菜单。 快捷菜单:叫上下文菜单,或者叫弹出式菜单、快捷菜单。. 3.1.2 创建菜单.
E N D
菜单、工具栏和状态栏是Windows不可或缺的界面元素。其中,菜单和工具栏提供了用户传递命令的界面,状态栏提供了一个输出区域。菜单、工具栏和状态栏是Windows不可或缺的界面元素。其中,菜单和工具栏提供了用户传递命令的界面,状态栏提供了一个输出区域。 • 本章主要介绍以下内容: • (1)菜单。 • (2)工具栏。 • (3)状态栏。 民政学院软件学院 蒋国清
3.1 菜单 • 重点介绍: • 菜单类型 • 创建菜单 • 菜单设计 • 菜单程序 • 键盘快捷键 民政学院软件学院 蒋国清
3.1.1 菜单类型 • 菜单是用户与程序交互的一个非常重要的元素,使用菜单方便了用户的操作。 • Windows的菜单分为两种类型: • 固定菜单:是固定在菜单栏上的菜单。 • 快捷菜单:叫上下文菜单,或者叫弹出式菜单、快捷菜单。 民政学院软件学院 蒋国清
3.1.2 创建菜单 • 1. 创建菜单资源 • 菜单资源既可以在菜单编辑器中创建,也可以通过代码在程序中创建。这里介绍3种创建菜单的方法。 • (1)从菜单栏的菜单命令创建菜单资源。 • (2)通过资源面板的快捷菜单选项创建菜单。 • (3)在程序中通过代码创建菜单资源。 • 通过如下代码,即可创建一个空的菜单资源。 • CMenu popup; • popup.CreatePopupMenu(); 民政学院软件学院 蒋国清
3.1.2 创建菜单 • 3.1.2 创建菜单 方法是: • (1)双击菜单编辑器中新增菜单的方框,弹出Menu Item Properties对话框(图4-4)。 • (2)输入菜单的标题。在相应的标题字母前加“&”,则该字母为菜单的助记符。 民政学院软件学院 蒋国清
图4-4 创建菜单 民政学院软件学院 蒋国清
3. 创建菜单项方法是: • (1)在菜单编辑器中单击打开要添加菜单项的菜单,或者选中某个已有菜单后按Insert键,双击新增菜单项的方框,弹出Menu Item Properties对话框(图4-5)。 • (2)选择或输入菜单项的ID,输入菜单项的标题。在相应的标题字母前加“&”,则该字母为菜单项的助记符。 • (3)根据需要选择对话框中的复选框,以便决定菜单项的各个属性。 民政学院软件学院 蒋国清
图4-5 Menu Item Properties对话框 民政学院软件学院 蒋国清
3. 创建快捷菜方法如下: (1)新建一个菜单资源。 (2)在该菜单资源创建一个菜单。 (3)为菜单创建菜单项。 (4)保存菜单资源。 (5)在源代码文件添加如下代码: Menu myMenu; VERIFY(myMenu.loadMenu(IDR_MENU1)); (Menu* pPopup=myMenu.GetSubMenu(0)); ASSERT(pPopup!=NULL); pPopup->TrackPopupMenu(TPM_LEFTALIGN||TPM_RIGHTBUTTON, x, y, AfxGetMainWnd()); 民政学院软件学院 蒋国清
3.1.3 菜单设计 1.往菜单系统菜单添加菜单项 2. 创建相应的快捷菜单: 首先创建一个新的菜单资源,然后在该菜 单资源中添加菜单项。 民政学院软件学院 蒋国清
3.1.4 菜单程序 • 1. 菜单的消息映射 • 定义好菜单资源后,就可以对每一个菜单项进行消息映射。 • 在MFC应用程序中使用起来却是很简单。所有的消息都通过消息响应表映射到响应函数,编程人员所要做的主要工作是在添加映射项后,完成消息的处理函数。 民政学院软件学院 蒋国清
2. 菜单的相关操作包括: • (1)创建菜单 • (2)装入菜单。 • (3)菜单的初始化。 • (4)添加菜单项。 • (5)修改菜单项。 • (6)删除菜单项。 • (7)获取菜单项。 民政学院软件学院 蒋国清
3. 添加单击菜单项的处理函数利用3.1.3小节建立好的菜单项,映射它们的单击处理函数。 • (1)打开“menu”工程。 • (2)点击“查看”->“建立类向导”,弹出如图4-9所示的对话框,在CMenuView类映射“新菜单”下三个子菜单的COMMAND消息 • (3)修改上一步骤映射的消息处理函数,如书本程序代码3.1所示。 • (4)编译运行应用程序。点击“新菜单”->“新菜单2”->“新菜单2-2”,会弹出消息对话框提示选择了该菜单项,如图4-10所示。 民政学院软件学院 蒋国清
图4-9 映射COMMAND消息 图4-10 程序运行效果 民政学院软件学院 蒋国清
3. 快捷菜单的编程 • 快捷菜单是一种浮动的弹出式菜单,它是一种新的用户界面设计风格。当用户按下鼠标右键时,就会相应地弹出一个快捷菜单,其中提供了几个与当前选择内容相关的选项。 • 创建快捷菜单需要用到CMenu类的TrackPopupMenu()函数来设置和显示快捷菜单,其原型如下: • BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); • 其中,nFlags为快捷菜单坐标设定方式和鼠标操作方式。 民政学院软件学院 蒋国清
快捷菜单的制作方式有两种: • (1)用CreatePopupMenu()建立一个空快捷菜单,再使用AppendMenu()或InsertMenu()函数增加所需的菜单项。 • (2)从菜单资源中获得一子菜单作为快捷菜单。 民政学院软件学院 蒋国清
3.1.5 键盘快捷键 • 1. 键盘快捷键编辑器 • 2. 为“Menu”工程的新菜单项添加键盘快捷键 民政学院软件学院 蒋国清
1. 键盘快捷键编辑器 • 打开键盘快捷键编辑器(图4-13)后,可以通过选中一项键盘快捷键后按Insert键添加一个键盘快捷键新项。 • 接着,双击键盘快捷键新项,会弹出Accel Properties对话框(图4-14)。在该对话框中,可以设置具体的键盘快捷键ID与具体的键盘快捷键。 民政学院软件学院 蒋国清
图4-13 键盘快捷键编辑器 民政学院软件学院 蒋国清
2. 为“Menu”工程的新菜单项添加键盘快捷键步骤如下: • (1)打开“Menu”工程。 • (2)选择要定义键盘快捷键的新菜单项,按Alt+Enter组合键。系统弹出Menu Item Properties对话框。 • (3)在标题文本框中将键盘快捷键添加到菜单项标题的后面。其中,菜单项ID_NEW1的键盘快捷键是Ctrl+A,菜单项ID_NEW2-1的键盘快捷键是Ctrl+B,ID_NEW2-2的键盘快捷键是Ctrl+C。在菜单标题后输入转移符“\t”,可以让所有键盘快捷键都按左对齐的方式显示,如图4-15所示。 民政学院软件学院 蒋国清
图4-16 建立键盘快捷键 民政学院软件学院 蒋国清
(4)在键盘快捷键编辑器中建立相应的快捷键表条目。双击键盘快捷键编辑器的空白行,在弹出的“Accel Properties”对话框中的ID选择新菜单项的ID,在快捷键中则设置与该菜单项相应的键盘快捷键。 • (5)编译运行应用程序,按快捷键就可执行相应的菜单操作。 民政学院软件学院 蒋国清
3.2 工具栏 • 3.2.1 工具栏编辑器 • 3.2.2 工具栏操作的相关函数 • 3.2.3 工具栏程序 民政学院软件学院 蒋国清
3.2.1 工具栏编辑器 • 1. 创建一个新的工具栏资源 • 2. 创建一个新的工具栏按钮 • 3. 移动一个按钮 • 3. 删除一个按钮 • 5. 在工具栏中插入间隔 • 6. 工具栏按钮属性的设置 民政学院软件学院 蒋国清
3.2.2 工具栏操作的相关函数 • 介绍与工具栏操作相关的函数: • 1. Create() • 2. LoadToolBar() • 3. LoadBitmap() • 3. SetBitmap() • 5. GetItemID() • 6. EnableDocking() 民政学院软件学院 蒋国清
1. Create() • Create()函数用于建立Windows工具栏,并且把它连接到工具栏对象上。Create()函数的原型为: • BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR ); • 函数创建成功则返回1,否则返回0。 民政学院软件学院 蒋国清
2. LoadToolBar() • 函数LoadToolBar()用于加载已有的工具栏资源,其函数原型如下: • BOOL LoadToolBar( LPCTSTR lpszResourceName ); • BOOL LoadToolBar( UINT nIDResource ); 民政学院软件学院 蒋国清
3. LoadBitmap() • LoadBitmap()函数用于装入工具栏按钮的位图资源,该位图做为显示在按钮上方的图形,其函数原型如下: • BOOL LoadBitmap( LPCTSTR lpszResourceName ); • BOOL LoadBitmap( UINT nIDResource ); 民政学院软件学院 蒋国清
3. SetBitmap() • SetBitmap()函数用于指定工具栏按钮的位图资源,其函数原型如下: • BOOL SetBitmap( HBITMAP hbmImageWell ); • 其中,参数hbmImageWell是位图资源句柄。 民政学院软件学院 蒋国清
5. GetItemID() • 函数GetItemID()用于以按钮的索引编号来查找其命令ID值,其函数原型如下: • UINT GetItemID( int nIndex ) const; • 其中,参数nIndex工具栏按钮的索引编号。 民政学院软件学院 蒋国清
6. EnableDocking() • 函数EnableDocking()是CControlBar类的成员函数,用于设置工具栏的浮动性,其函数原型为: • void EnableDocking( DWORD dwStyle ); • 其中,参数dwStyle是工具栏浮动的位置 民政学院软件学院 蒋国清
3.2.3 工具栏程序 • 本小节创建一个简单的能够画直线、圆和矩形的程序,通过切换工具栏按钮能够改变要画的图形。 • 程序的创建步骤如下: 民政学院软件学院 蒋国清
(1)点击“文件”->“新建”,弹出新建对话框。切换到工程标签页,在对话框左侧选择“MFC AppWizard(exe)”工程,在对话框右侧输入工程的名字,如toolbar。输入或者选择工程保存的位置。单击“确定”按钮新建一个应用程序工程,如图4-22所示。 • (2)在弹出的“MFC AppWizard-Step 1”对话框中,为简单起见,选择单文档的应用程序类型,如图4-23所示。 民政学院软件学院 蒋国清
图4-22 新建应用程序工程 图4-23 选择单文档应用程序类型 民政学院软件学院 蒋国清
(3)创建工具栏资源。打开资源面板,右键单击“Toolbar”文件夹,在快捷菜单中选择“Insert Toolbar”菜单项,创建一个新的工具栏资源,ID为IDR_TOOLBAR1。在工具栏编辑器中添加3个工具栏按钮,按钮的ID号分别为ID_LINE、ID_RECTANGEL与ID_ELLIPSE,添加后工具栏资源如图4-24所示。 民政学院软件学院 蒋国清
图4-24 工具栏资源 民政学院软件学院 蒋国清
(4)在应用程序中加载工具栏资源。在CMainFrame类中添加一个管理工具栏的对象m_wndDrawToolBar,也就是在CMainFrame类的定义代码中添加如下代码:(4)在应用程序中加载工具栏资源。在CMainFrame类中添加一个管理工具栏的对象m_wndDrawToolBar,也就是在CMainFrame类的定义代码中添加如下代码: • protected: // control bar embedded members • CToolBar m_wndDrawToolBar; • 接着,在CMainFrame 类的OnCreate()函数中添加装载工具栏的代码.如课本程序代码3.4 民政学院软件学院 蒋国清
(5)在CToolbarView类中手动添加变量,代码如下:(5)在CToolbarView类中手动添加变量,代码如下: • public: • CPoint m_point1, m_point2;//记录鼠标按下和松开的点 • bool m_bLButtonDown;//标识鼠标是否被按下 • enum {DRAW_LINE, DRAW_RECTANGEL, DRAW_ELLIPSE} m_flag;//标识画的图形类型 • 接着,在CToolbarView类的构造函数中初始化这些变量,如课本程序代码3.5所示。 民政学院软件学院 蒋国清
(6)点击“查看”->“建立类向导”,在“MFC ClassWizard”对话框中在CToolBarView类映射新创建的3个工具栏按钮的命令处理消息和界面更新处理消息。图4-25为映射ID_LINE工具栏按钮的命令处理消息。 • 修改消息的处理函数,如课本程序代码3.6所示。 民政学院软件学院 蒋国清
图4-25 映射工具栏按钮的消息 民政学院软件学院 蒋国清
(7)点击“查看”->“建立类向导”,在“MFC ClassWizard”对话框中在CToolBarView映射鼠标按下、鼠标松开和鼠标移动消息的处理。如图4-26为映射WM_LBUTTONDOWN消息。 • 修改鼠标消息的处理函数,如课本程序代码3.7所示。 民政学院软件学院 蒋国清
图4-26 映射鼠标消息 民政学院软件学院 蒋国清
(8)修改CToolbarView类的OnDraw()函数, • (9)编译运行应用程序,在程序中画一个椭圆的效果如图4-27所示。 民政学院软件学院 蒋国清
图4-27 程序的运行效果 民政学院软件学院 蒋国清
3.3 状态栏 • 3.3.1 创建状态栏 • 3.3.2 状态栏操作的相关函数 • 3.3.3 状态栏程序 民政学院软件学院 蒋国清
本程序在状态栏中显示系统的时间,程序实现的步骤如下:本程序在状态栏中显示系统的时间,程序实现的步骤如下: • (1)点击“文件”->“新建”,弹出新建对话框。切换到工程标签页,在对话框左侧选择“MFC AppWizard(exe)”工程,在对话框右侧输入工程的名字,如status。输入或者选择工程保存的位置。单击“确定”按钮新建一个应用程序工程,如图4-28所示。 • (2)在弹出的“MFC AppWizard-Step 1”对话框中,为简单起见,选择单文档的应用程序类型,如图4-29所示。 民政学院软件学院 蒋国清
图4-28 新建应用程序工程 民政学院软件学院 蒋国清
(3)在文件“MainFrm.cpp”中往indicators数组添加一个用于显示系统时间的显示面板,如程序代码3.9所示。(3)在文件“MainFrm.cpp”中往indicators数组添加一个用于显示系统时间的显示面板,如程序代码3.9所示。 • 图4-29 选择单文档应用程序类型 民政学院软件学院 蒋国清
(4)在CMainFrame类中添加一个用于记录时钟事件ID号的变量,代码如下:(4)在CMainFrame类中添加一个用于记录时钟事件ID号的变量,代码如下: • protected: // control bar embedded members • UINT m_timer; • 接着,在CMainFrame类的OnCreate()函数中创建状态栏,设置时钟面板信息,设置时钟, 民政学院软件学院 蒋国清
(5)点击“查看”->“建立类向导”,在“MFC ClassWizard”对话框中,在CMainFrame类映射时钟消息,如图4-30所示。 • 图4-30 映射时钟消息 民政学院软件学院 蒋国清