菜单、工具栏和状态栏.ppt_第1页
菜单、工具栏和状态栏.ppt_第2页
菜单、工具栏和状态栏.ppt_第3页
菜单、工具栏和状态栏.ppt_第4页
菜单、工具栏和状态栏.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,第6章菜单、工具栏和状态栏,6.1 菜单 6.2 工具栏 6.3 状态栏,2,第6章菜单、工具栏和状态栏,6.1 菜单 6.2 工具栏 6.3 状态栏,3,6.1菜单 (1 of 11),对于菜单的显示都遵循下列一些规则: 若某菜单项标题后有“”,那么在点击某菜单项会弹出一对话框。 若某项菜单有子菜单,那么在该菜单项文本后有“”。 菜单项需要助记符,用括号将带下划线的字母括起来。助记符与Alt构成一个组合键,当按住“Alt”键不放,再敲击该字母时,对应的菜单项就会被选中。 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。任何时候按下快捷键,相应的菜单命令都会被执行。,图6.1 File菜单,4,6.1菜单 (2 of 11),6.1.1 用编辑器设计菜单 编辑菜单 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,如图。,图6.3 菜单属性对话框,5,6.1菜单 (3 of 11),6,6.1菜单 (4 of 11),需要注意的是: 当菜单项的属性中选中了Pop_up(该菜单包含子菜单)时,对话框中ID、Separator和Prompt项无效。 增加新的菜单项后,用户可以用鼠标将菜单项拖到其他位置,而当菜单项位置改变时,其属性并不改变。,图6.5 添加的菜单项,7,6.1菜单 (5 of 11),菜单命令的消息映射 例Ex_Mmenu “成绩输入”菜单项的映射。 (1) 进入MFC ClassWizard对话框,切换到Message Maps页面。 (2) 从“Class name”列表中选择CMainFrame,在IDs列表中选择ID_SCORE_IN,然后在Messages框中选择COMMAND消息,如图。,图6.6 消息的选择,8,6.1菜单 (6 of 11),(3) 单击Add Function按钮或双击COMMAND消息,输入成员函数的名称。如图6.7所示。 (4) 单击OK。选择新增加的成员函数,单击Edit Code按钮(或直接在函数名双击鼠标左键),就可以在此成员函数中添加一些代码。例如: void CMainFrame:OnScoreIn() / TODO: Add your command handler code here AfxMessageBox(“现在就输入成绩吗?“); (5)编译并运行。在应用程序的顶层菜单上,单击“成绩输入”菜单项或按Alt+S组合键,如图6.8所示。,图6.7 添加成员函数对话框,图6.8 菜单命令执行的结果,9,6.1菜单 (7 of 11),6.1.2 使用键盘快捷键 (1) 先打开上例的项目工作区窗口中Accelerator的资源项,双击IDR_MAINFRAME,如图。,10,6.1菜单 (8 of 11),(2) 要建立一新的加速键,双击加速键列表的最下端的空行,如图6.10,其中可设置的属性如表6.2。 (3) 在上述对话框中,选择ID_SCORE_IN作为要设定快捷键的ID号,单击Next Key Typed,按下Ctrl+1作为此加速键的键值。,图6.10 “Accel Properities”对话框,11,6.1菜单 (9 of 11),6.1.3 使用快捷菜单右键菜单 用资源编辑器和MFC库的CMenu:TrackPopupMenu函数可以创建快捷菜单。CMenu:TrackPopupMenu函数原型如下: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 其中: x和y表示菜单顶端(一般为左上角)的水平坐标和垂直坐标。 pWnd表示弹出菜单的窗口。 lpRect是一个RECT结构或CRect对象指针,表示一个矩形区域,不在该区域单击鼠标时,则弹出菜单消失;当lpRect为NULL时,若击在菜单外面,菜单立刻消失。,12,6.1菜单 (10 of 11),例Ex_Menu创建弹出菜单。 (1) 选择“Insert”菜单“Resource”命令,为应用程序添加一个新的菜单资源。 (2) 用菜单编辑器,为该菜单资源中的顶层菜单的第一项加一任意标题(实际上该标题无任何作用),在此菜单项下依次添加如下表所示的菜单项。 (3) 将此菜单资源ID号改为IDR_MYFLOATMENU (默认的ID号为 IDR_MENU1) 。 (4) 按Ctrl+W快捷键打开ClassWizard,将出现一对话框,询问是“选择一个已存在的类”,还是“创建一个新类”。选择“选择一个已存在的类”项并选定CMainFrame类。,13,6.1菜单 (11 of 11),(5) 在CMainFrame类中,选择上表中所列的菜单ID,双击COMMAND消息。这里仅为菜单ID_MENU_SCOREIN映射COMMAND消息,添加代码: void CMainFrame:OnMenuScorein() AfxMessageBox(“现在就输入成绩吗?“); (6) 在CMainFrame类加入WM_CONTEXTMENU消息处理函数,代码如下: void CMainFrame:OnContextMenu(CWnd* pWnd, CPoint point) CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU); menu.GetSubMenu(0)- TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); (7) 运行并测试。在应用程序的窗口客户区中单击鼠标右键,弹出如图菜单。 “成绩打印”菜单命令没有消息处理函数,因此它是灰显的,用户不能使用它们。若用户选中“成绩输入”菜单命令,则会执行相应的代码。,图6.13 快捷菜单,14,第6章菜单、工具栏和状态栏,6.1 菜单 6.2 工具栏 6.3 状态栏,15,6.2工具栏 (1 of 6),6.2.1 使用工具栏编辑器 例:选择“File”“Open Workspace”,创建单文档应用程序Ex_Sdi 。在项目工作区窗口中选择ResourceView标签,双击“Toolbar”项中的IDR_MAINFRAME,则工具栏编辑器出现在主界面的右边,如图。,16,6.2工具栏 (2 of 6),可以对工具栏进行的操作: (1) 创建一个新的工具栏按钮 在新建的工具栏中,最右端总有一个空按钮,双击该按钮弹出其属性对话框,在ID框中输入其标识符名称。单击该按钮,在编辑器的视窗内进行编辑,这个编辑就是绘制一个按钮位图。 (2) 移动一个按钮 在工具栏中移动一个按钮,用鼠标左键点中它并拖动至相应位置即可。 若在移动一个按钮的同时,按下Ctrl键,则在新位置复制一个按钮。 (3) 删除一个按钮 如果用户拖动它离开工具栏位置,则此按钮从工具栏中消失(被删除)。 但若选中按钮后,单击Delete键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。,17,6.2工具栏 (3 of 6),可以对工具栏进行的操作: (4) 在按钮之间插入/删除空格 如果按钮左侧没有空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,则此按钮左侧出现空格。 如果按钮左侧有空格而按钮右侧没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮右侧将出现空格。 如果按钮左、右两侧均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮左侧的空格保留,按钮右侧的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮左侧的空格消失,右侧的空格保留。,18,6.2工具栏 (4 of 6),可以对工具栏进行的操作: (5) 设置工具栏按钮的属性 双击某工具按钮,就会弹出其属性对话框,如下图所示。,图6.15 工具栏按钮属性对话框,19,6.2工具栏 (5 of 6),6.2.2 工具栏和菜单相结合 例Ex_T&M 将菜单项ID_SCORE_IN与工具按钮相结合。 (1) 在单文档应用程序Ex_Sid中,作如下操作; (2) 利用工具栏编辑器设计一个工具按钮,如图; (3) 双击刚才设计的钮工具按钮图形,弹出该工具按钮的属性对话框;在属性对话框中,将工具按钮的ID号设为ID_SCORE_IN,在Prompt框内键入“向系统输入学生成绩n成绩输入”;,图6.16 工具栏按钮的设计,20,6.2工具栏 (6 of 6),6.2.2 工具栏和菜单相结合 例Ex_T&M 将菜单项ID_SCORE_IN与工具按钮相结合。 (4) 编译并运行程序。在应用程序的工具栏上,将鼠标指针移至刚才设计的工具按钮处,这时在状态栏上显示出“向系统输入学生成绩”信息,若稍等片刻后,还会弹出提示小窗口,显示出“成绩输入”字样。,21,第6章菜单、工具栏和状态栏,6.1 菜单 6.2 工具栏 6.3 状态栏,22,6.3状态栏 (1 of 9),6.3.1 状态栏的定义 用AppWizard创建的SDI或MDI应用程序框架中,有一个静态的indicators数组,这个数组中的元素通常都是一些字符串资源的ID号,它是在MainFrm.cpp文件中被定义的,被MFC用作状态栏的定义。 默认的indicators数组包含4个元素,如下图所示:,23,6.3状态栏 (2 of 9),6.3.2 状态栏的常用操作 增加和减少窗格 状态栏中的窗格可以分为信息行窗格和指示器窗格两类。 若在状态栏中增加一个信息行窗格,则在indicators数组中的适当位置中增加一个ID_SEPARATOR标识即可; 若在状态栏中增加一个指示器窗格,则在indicators数组中的适当位置增加一个在字符串资源中定义过的资源ID号即可; 若在状态栏中减少一个信息行或者指示器窗格,其操作与增加类似,只需减少一个对应的数组元素即可。,24,6.3状态栏 (3 of 9),6.3.2 状态栏的常用操作 在状态栏上显示文本 有三种办法可以在状态栏窗格显示文本信息: (1) 调用CWnd:SetWindowText更新信息行窗格(或窗格0)中的文本。 若状态栏变量为m_wndStatusBar,则m_wndStatusBar. SetWindowText(“消息”)语句将在第一个信息行窗格内显示“消息”字样。,25,6.3状态栏 (3 of 9),6.3.2 状态栏的常用操作 在状态栏上显示文本 有三种办法可以在状态栏窗格显示文本信息: (2) 手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用CCmdUI:SetText函数。,26,6.3状态栏 (3 of 9),6.3.2 状态栏的常用操作 在状态栏上显示文本 有三种办法可以在状态栏窗格显示文本信息: (3) 调用CStatusBar:SetPaneText函数更新任何窗格(包括信息行窗格)中的文本。此函数原型描述如下: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 其中:nIndex表示设置的窗格的索引(第一个窗格的索引为0);lpszNewText表示要显示的字符串;bUpdate为TRUE表示系统自动更新显示的结果。,27,6.3状态栏 (4 of 9),例Ex_Status 在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。 (1) 将前面的单文档应用程序Ex_Sdi打开或者新建一个单文档应用程序; (2) 将项目工作区窗口切换到ResourceView页面,双击“String Table”项的“String Table”图标。在字符串列表的最后一行空项上双击鼠标左键,如图6.17所示。 (3) 该对话框中,可以指定相应的ID和字符串值,这里加入两个字符串资源ID_LEFT和ID_RIGHT,其字符个数的多少决定窗格的大小。如图6.18。,图6.17 字符串属性对话框,28,6.3状态栏 (5 of 9),(4) 打开MainFrm.cpp文件,将原先的indicators数组修改如下: static UINT indicators = ID_SEPARATOR, / 第一个信息行窗格 ID_SEPARATOR, / 第二个信息行窗格 ID_LEFT, / 第三个窗格 ID_RIGHT, / 第四个窗格 ; (5) 必须手动添加消息处理函数原型。打开Ex_SdiView.h文件,在AFX_MSG内增加消息处理语句,ClassWizard以后允许访问和编辑该代码。 protected: /AFX_MSG(CEx_SdiView) afx_msg void OnUpdateXY(CCmdUI* pCmdUI); /AFX_MSG DECLARE_MESSAGE_MAP(),29,6.3状态栏 (6 of 9),(6) 打开Ex_SdiView.cpp文件,在其消息入口处手动添加消息映射函数: BEGIN_MESSAGE_MAP(CEx_SdiView, CView) /AFX_MSG_MAP(CEx_SdiView) ON_UPDATE_COMMAND_UI(ID_LEFT, OnUpdateXY) ON_UPDATE_COMMAND_UI(ID_RIGHT, OnUpdat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论