




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 菜单、快捷键和控制条,菜单基础知识,Windows应用程序中除了客户区外还有非客户区。非客户区包括窗口的边框、标题栏、菜单栏、工具栏、状态栏和滚动条。其中菜单栏 、工具栏和状态栏是用户与应用程序进行交互的重要工具,菜 单,几乎所用的Windows应用程序都会使用到菜单,它为用户提供了操作应用程序需要的命令,是应用程序中可操作命令的集合。菜单分为两类:一类是依附于框架窗口的一般菜单,包括主菜单和子菜单,菜 单,主菜单是最高层的菜单,子菜单是从主菜单下拉出的菜单,其位置都是固定的;另一类是弹出式菜单,也称为快捷菜单,是单击鼠标右键后,在光标位置出现的浮动式菜单。 添加新菜单项 编辑菜单项的
2、属性,菜 单,删除菜单项 添加菜单消息处理函数 启用和禁用菜单命令 复选和单选标记菜单命令 创建弹出式菜单 快捷键,添加新菜单项,应用AppWizard创建的应用程序菜单栏。 在多文档界面下增加了一个“窗口”菜单项,添加新菜单项,用户往往不满足于AppWizard自动生成的菜单项,比如创建文件翻译系统中的菜单栏时,除以上菜单项外可能还需要对翻译语言提供选择菜单项。这时就需要用户根据自己的实际需要手动为菜单栏添加菜单项,编辑菜单项的属性,在为菜单项添加名称时,系统已经自动打开一个名为“Menu Item Properties” 的对话框。输入的菜单项名称将会出现在“标题”文本框处,编辑菜单项的属
3、性,该对话框中各选项的含义分别是: “ID”文本框:菜单项的唯一标识,可由系统生成,也可由用户自定义。 “标题”文本框:用户可见的菜单项名称,编辑菜单项的属性,编辑菜单项的属性,暂停”下拉列表框:选中相应菜单后就退出其所在的菜单。 “提示”文本框:鼠标移动到相应菜单处时,在窗口状态栏会出现提示信息,例题分析,4.1 菜单,学习目标 1. 响应菜单消息 2. 控制菜单状态 3. 使用快捷键,3.1,返回第4章,程序的实现步骤,1、利用AppWizard生成程序框架(MenuTest) 2、编辑资源 3、加入菜单消息处理函数 4、菜单命令的更新控制,步骤1 生成程序框架(MenuTest,项目名称
4、: MenuTest 选择单文档界面应用程序(Single document,步骤2 编辑资源,1.编辑菜单资源 画图 Pop-up 选中 Caption ID Prompt 矩形( dc.Rectangle(50,50,200,150);,void CMenuTestView:OnDrawCircle() CClientDC dc(this); dc.Ellipse(250,50,400,150);,步骤4 菜单命令的更新控制,1. 在画图 菜单中再添加两个菜单项 Caption ID Prompt 允许画矩形 ID_DRAW_ENABLE - 禁止画矩形 ID_DRAW_DISABLE -
5、 在视类中添加一个记录当前“矩形”菜单项状态的变量 BOOL m_Enable; 3. 在构造函数中初始化数据成员m_Enable m_ Enable =TRUE,步骤4 菜单命令的更新控制,4. 添加 菜单响应函数 Class Name Objects IDs Messages CMenuTestView ID_DRAW_ENABLE COMMAND CMenuTestView ID_DRAW_ DISABLE COMMAND CMenuTestView ID_DRAW_RECT UPDATE_COMMAND_UI CMenuTestView ID_DRAW_ENABLE UPDATE_CO
6、MMAND_UI CMenuTestView ID_DRAW_ DISABLE UPDATE_COMMAND_UI,void CMenuTestView:OnUpdateDrawRect(CCmdUI* pCmdUI) pCmdUI-Enable(m_Enable);,步骤4 菜单命令的更新控制,void CMenuTestView:OnDrawDisable() m_Enable = FALSE;,void CMenuTestView:OnDrawEnable() m_Enable = TRUE;,void CMenuTestView:OnUpdateDrawEnable(CCmdUI* p
7、CmdUI) pCmdUI-SetCheck(m_Enable ? 1:0);,void CMenuTestView:OnUpdateDrawDisable(CCmdUI* pCmdUI) pCmdUI-SetCheck(m_Enable ? 0:1);,基本知识,1、pCmdUI-Enable(true | false); 说明:使用户界面对象有效或无效 2、pCmdUI-SetCheck( 1| 0); 说明:设置或取消选中用户界面对象 3、使用COMMAND消息响应菜单项的选择事件 4、 UPDATE_COMMAND_UI消息控制菜使用单项状态,4.2 快捷菜单,学习目标 1. 实现快捷
8、菜单,返回第4章,程序的实现步骤,1、编辑快捷菜单资源 2、显示跟踪菜单 3、添加菜单响应函数 4、实现对话框功能,步骤1 编辑快捷菜单资源,添加菜单(IDR_POPUP_MENU ) Popup1 选中Pop-up Caption ID 编辑矩形坐标 ID_EDIT_RECT 编辑椭圆坐标 ID_EDIT_CIRCLE,4.2,步骤2 显示快捷菜单,添加响应函数 Class Name ObjectsIDs Messages CMainFrame CMainFrame WM_CONTEXTMENU,4.2,void CMainFrame:OnContextMenu(CWnd* pWnd, CP
9、oint point) / TODO: Add your message handler code here CMenu menu; if(menu.LoadMenu(IDR_POPUP_MENU) CMenu *pPopup=menu.GetSubMenu(0); pPopup-TrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,this);,步骤2 显示快捷菜单,4.2,步骤3 添加菜单消息处理函数,1) 编辑对话框资源,静态文本框,IDC_STATIC,左上角坐标(X1,Y1) 静态文本框,IDC_STATIC,
10、右下角坐标(X2,Y2) 编辑框,IDC_EDIT_X1 编辑框,IDC_EDIT_Y1 编辑框,IDC_EDIT_X2 编辑框,IDC_EDIT_Y2 按扭控件,IDOK,确定 按扭控件,IDCANCEL,取消,4.2,步骤3 添加菜单消息处理函数,2)为对话框添加控件关联变量 IDC_EDIT_X1,int,m_nX1 IDC_EDIT_Y1,int,m_nY1 IDC_EDIT_X2,int,m_nX2 IDC_EDIT_Y2,int,m_nY2 (3)在主框架中加入变量并初始化 int m_nRectLeft; int m_nRectTop; int m_nRectRight; int
11、 m_nRectBottom; int m_nCircleLeft; int m_nCircleTop; int m_nCircleRight; int m_nCircleBottom,4.2,CMainFrame:CMainFrame() / TODO: add member initialization code here m_nRectLeft = 50; m_nRectTop = 50; m_nRectRight = 200; m_nRectBottom = 150; m_nCircleLeft = 50; m_nCircleTop = 50; m_nCircleRight = 200
12、; m_nCircleBottom = 150;,步骤3 添加菜单消息处理函数,4.2,void CMenuTestView:OnDrawRect() CMainFrame *pMainFrame = (CMainFrame *) AfxGetApp()-GetMainWnd(); CClientDC dc(this); dc.Rectangle(pMainFrame-m_nRectLeft,pMainFrame-m_nRectTop, pMainFrame-m_nRectRight,pMainFrame-m_nRectBottom); void CMenuTestView:OnDrawCir
13、cle() CMainFrame *pMainFrame = (CMainFrame *) AfxGetApp()-GetMainWnd(); CClientDC dc(this); dc.Ellipse(pMainFrame-m_nCircleLeft,pMainFrame-m_nCircleTop, pMainFrame-m_nCircleRight,pMainFrame-m_nCircleBottom);,步骤3 添加菜单消息处理函数,4) 修改画图函数,4.2,步骤3 添加菜单消息处理函数,5)加入菜单消息处理函数,void CMenuTestView:OnEditRect() CDl
14、gEdit dlg(1); dlg.DoModal(); void CMenuTestView:OnEditCircle() CDlgEdit dlg(2); dlg.DoModal();,4.2,步骤4 实现对话框功能,1)修改构造函数,CDlgEdit:CDlgEdit(int type, CWnd* pParent /*=NULL*/) : CDialog(CDlgEdit:IDD, pParent) /AFX_DATA_INIT(CDlgEdit) m_nX1 = 0; m_nX2 = 0; m_nY1 = 0; m_nY2 = 0; /AFX_DATA_INIT m_nType =
15、type;,2)添加确定命令按扭响应函数OnOK(,4.2,步骤4 实现对话框功能,void CDlgEdit:OnOK() UpdateData(TRUE); CMainFrame *pMainFrame = (CMainFrame *) AfxGetApp()-GetMainWnd(); if(m_nType = 1) pMainFrame-m_nRectLeft = m_nX1; pMainFrame-m_nRectTop = m_nY1; pMainFrame-m_nRectRight = m_nX2; pMainFrame-m_nRectBottom = m_nY2; else if
16、(m_nType = 2) pMainFrame-m_nCircleLeft = m_nX1; pMainFrame-m_nCircleTop = m_nY1; pMainFrame-m_nCircleRight = m_nX2; pMainFrame-m_nCircleBottom = m_nY2; CDialog:OnOK();,4.2,基本知识,OnContextMenu()函数 CMenu类 (1)LoadMenu()函数:载入菜单资源 (2)TrackPopupMenu()函数:在指定位置弹出菜单。 AfxGetApp()函数 CWinApp 类的GetMainWnd()函数,4.2
17、,形式参数说明,4.3 动态菜单,学习目标 1. 菜单动态增加与删除 2. 用户自定义消息 3. 动态菜单消息响应,4.3,返回第4章,程序的实现步骤,编辑菜单资源 添加菜单响应函数 加入动态菜单响应函数,4.3,步骤1 编辑菜单资源,为菜单(IDR_POPUP_MENU )添加两个菜单项: Caption ID 1.Seprator 2.增加椭圆控制菜单 ID_ADD_MENU 3.删除椭圆控制菜单 ID_DELETE_MENU,4.3,步骤2 添加菜单响应函数,1. OnAddMenu() 2. OnDeleteMenu(,4.3,步骤2 添加菜单响应函数,4.3,void CMainFr
18、ame:OnAddMenu() / TODO: Add your command handler code here CString menu2; menu0=允许画椭圆; menu1=禁止画椭圆; CWnd *pMainFrame=AfxGetMainWnd(); CMenu *pMenuDyna=NULL; CMenu *pMenu=NULL; CMenu *pTopMenu=pMainFrame-GetMenu(); int iPos; for(iPos=pTopMenu-GetMenuItemCount()-1; iPos=0; iPos-) pMenu=pTopMenu-GetSub
19、Menu(iPos); if(pMenu,步骤2 添加菜单响应函数,4.3,void CMainFrame:OnDeleteMenu() / TODO: Add your command handler code here CWnd *pMainFrame=AfxGetMainWnd(); CMenu *pMenuDyna=NULL; CMenu *pMenu=NULL; CMenu *pTopMenu=pMainFrame-GetMenu(); int iPos; for(iPos=pTopMenu-GetMenuItemCount()-1; iPos=0; iPos-) pMenu=pTo
20、pMenu-GetSubMenu(iPos); if(pMenu,步骤3 添加动态菜单响应函数,在类CMainFrame中增加一个变量并初始化 int m_SelectMenu; 当m_SelectMenu为0时,第一项为选中状态,允许画椭圆。否则第二项为选中状态,禁止画椭圆,4.3,CMainFrame:CMainFrame() / TODO: add member initialization code here m_SelectMenu =0;,步骤3 添加动态菜单响应函数,2. 重载主框架类的OnCmdMsg()函数 Project: MenuTest Class Name:CMain
21、Frame Objects IDs:CMainFrame Messages: OnCmdMsg,4.3,4.3,步骤3 添加动态菜单响应函数,BOOL CMainFrame:OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) if(pHandlerInfo=NULL) for(int i=0; i2; i+) if(nID=(UINT) (WM_USER+10+i) if(nCode=CN_COMMAND) DoSelectMenu(i); else if(nCode=CN_UPDATE_C
22、OMMAND_UI) DoUpdateSelectMenu(i,(CCmdUI *) pExtra); return true; return CFrameWnd:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);,步骤3 添加动态菜单响应函数,3. 在CMainFrame类中增加两个函数 DoSelectMenu() DoUpdateSelectMenu(,4.3,void CMainFrame:DoSelectMenu(int i) m_nSelectMenu = i;,步骤3 添加动态菜单响应函数,4.3,void CMainFrame:DoUpdat
23、eSelectMenu(int i, CCmdUI *pCmdUI) if(i=m_nSelectMenu) pCmdUI-SetCheck(1); else pCmdUI-SetCheck(0); pCmdUI-Enable(true);,步骤3 添加动态菜单响应函数,4.为椭圆菜单项加入UPDATE_COMMAND_UI消息处理函数,4.3,void CMainFrame:OnUpdateDrawCircle(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here if(m_nSelectMenu = 0)
24、pCmdUI-Enable(true); else pCmdUI-Enable(false);,基本知识,CWnd 类:GetMenu() 函数 CMenu类 (1)GetMenuItemCount()函数 (2)GetMenuItemID()函数 (3)DeleteMenu()函数 (4)AppendMenu()函数 OnCmdMsg消息,4.3,工 具 栏,工 具 栏,工具栏还具有工具提示功能,当用户将鼠标光标停留在对应工具按钮上几秒钟,工具提示便会出现在工具栏按钮下方的文本框中。 向工具栏添加按钮 添加工具栏间隔,工 具 栏,删除工具栏按钮 设置按钮属性 启用和禁用工具栏按钮,向工具栏添
25、加按钮,向工具栏添加按钮,Visual C+中主要体现为绘制工具栏按钮的位图,该位图以BMP文件格式保存。工具栏位图是一系列覆盖工具栏按钮的图形,每个按钮对应一个图形。在默认状态下,每个图形为16像素宽,15像素高,向工具栏添加按钮,添加工具栏间隔,工具栏中的按钮从功能上可分为几大类,为了进行区别,往往在不同的类别之间使用间隔符号进行隔离。 为工具栏添加间隔的方法非常简单,只需选择空白工具栏按钮,并轻轻向右拖动一点,即为工具栏添加了一个间隔,删除工具栏按钮,AppWizard自动生成的工具栏按钮,在实际应用程序中可能会显得多余,这时可将其删除,设置按钮属性,工具栏按钮也有自己的属性,其属性在“
26、Toolbar Button Properties” 对话框中进行设置,双击对应的工具栏按钮,打开属性对话框,设置按钮属性,对话框中各选项的含义如下: “ID”下拉列表框:输入或选择与按钮对应的ID号。 “D宽”文本框:按钮显示的宽度,单位为“像素”,默认值为16,设置按钮属性,H高”文本框:按钮显示的高度,单位为“像素”,默认值为15。 “M提示”文本框:输入的信息会在程序运行时在状态栏中进行显示。 【例6-8】 为【例6-7】中的工具栏按钮编辑属性。(光盘:第6章例6_16_10,启用和禁用工具栏按钮,与菜单项操作一样,用户没有为工具栏按钮写入消息处理函数或者用户自定义按钮未与某个已有消息
27、处理函数的菜单项对应时,工具栏按钮为灰色,即禁用状态。 同样,也可在类中添加一个用户界面处理函数,根据应用程序的某些条件,可有条件地启用和禁用一个工具栏按钮,4.4 工具条,学习目标 1. 自定义工具条 在工具条中添加控件,4.4,返回第4章,程序的实现步骤,编辑工具条资源 创建工具条 在工具条上添加控件 加入控件响应函数,4.4,步骤1 编辑工具条资源,添加工具条(IDR_MYTOOLBAR,4.4,ID_DRAW_RECT,ID_DRAW_CIRCLE,ID_DRAW_LINE,ID_COMBOBOX,工具条含四个工具按扭,其中前两个与菜单“画图”的前两个菜单项的ID号相同,第三个按扭用于
28、画直线,第四个按扭用来显示组合框,步骤2 创建工具条,在类CmainFrame中定义工具条数据成员: CToolBar m_wndMyToolBar; 在类CMainFrame的OnCreate函数中加入以下代码,4.4,if (!m_wndMyToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) | !m_wndMyToolBar.LoadToolBar(IDR_MYTOOLBAR
29、) TRACE0(Failed to create toolbarn); return -1; / fail to create . m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar,步骤2 创建工具条,3. 添加画线响应函数,4.4,void CMenuTestView:OnDrawLine() / TODO: Add your command handler code here CClientDC dc(this); dc.MoveTo(20, 20); d
30、c.LineTo(200, 200);,步骤3 在工具条上添加控件,在类CMainFrame中定义数据成员 CComboBox m_ComboBox; 2. 在CMainFrame的OnCreate函数中加入代码,4.4,CRect rect; m_wndMyToolBar.SetButtonInfo(3,ID_COMBOBOX,TBBS_SEPARATOR,160); m_wndMyToolBar.GetItemRect(3,步骤4 加入组合框响应函数,定位到MainFrm.h中类的定义处,在其中添加消息响应函数的原形: afx_msg void OnSelchangeCombo(); 定位
31、到MainFrm.cpp中消息映射宏的定义处,在其中添加ComboBox控件的ON_CBNSELCHANGE消息的映射宏: ON_CBN_SELCHANGE(ID_COMBOBOX,OnSelchangeCombo,4.4,步骤4 加入组合框响应函数,3. 在MainFrm.cpp中添加消息映射函数体,4.4,void CMainFrame:OnSelchangeCombo() CString mess; int CurSel; CurSel = m_ComboBox.GetCurSel(); mess = 您选择了第 ; char No3; itoa(CurSel,No,10); mess
32、+= No; mess += 项!; MessageBox(mess, 消息框,MB_OK | MB_ICONINFORMATION);,基本知识,CToolBar 类: CreateEx() 函数 SetButtonInfo () GetItemRect () CComboBox 类 Create ()函数 AddString()函数 SetCurSel ()函数 手工添加消息响应函数,4.4,3.5 状态条,学习目标 1. 在状态信息行显示信息 在状态指示器 显示键盘状态,4.5,返回第4章,程序的实现步骤,在文件MainFrm.cpp中,找到状态条indicators数组的定义处添加代码
33、 创建Ctrl键和Shift键状态指示器的字符串资源 为状态条添加标识号 在函数CMainFrame:OnCreate()函数中,添加状态条的设置代码 显示控制键状态 显示鼠标在视中的位置坐标,4.5,步骤1 在indicators数组中添加新元素,4.5,static UINT indicators = ID_SEPARATOR, / status line indicator ID_SEPARATOR, /显示x坐标 ID_SEPARATOR, /显示x坐标 ID_INDICATOR_CTRL, /显示Ctrl键的状态 ID_INDICATOR_SHIFT, /显示Shift键的状态 ID
34、_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,步骤2 创建Ctrl键和Shift键状态指示器的字符串资源,4.5,在Workspace窗口中双击ResourceView标签的String Table,打开字符串资源编辑器。选中一个以ID_INDICATOR为开头的字符串资源,按Insert键,插入两个新的字符串资源: ID Caption ID_INDICATOR_CTRL Ctrl ID_INDICATOR_SHIFT Shift,步骤3 为状态条添加标识号,通过菜单View下的Resource Symbols菜单项,打开Resou
35、rce Symbol对话框,单击New按扭,在Name中输入IDC_STATUSBAR,Value取默任值,单击OK按扭,步骤4 在函数CMainFrame:OnCreate()函数中,添加状态条的设置代码,4.5,if (!m_wndStatusBar.Create(this) | !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT) TRACE0(Failed to create status barn); return -1; / fail to create m_wndStatusBar.SetPaneInfo(1,IDC_STAT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T-ZJBS 001-2024 城市公共标识系统设计规范
- T-ZSA 230-2024 虚拟数字人多模态交互信息规范
- 二零二五年度荒山土地流转与林业碳汇项目合作合同
- 二零二五年度企业合规管理体系法律服务合同范本
- 二零二五年度离婚协议书模板及婚姻关系终止及财产分配
- 二零二五年度诊所医疗事故处理及责任划分合同
- 二零二五年度养老护理型住宅正规房屋出租合同
- 二零二五年度混凝土班组劳务合作施工安全责任合同
- 二零二五年度销售信息保密管理承诺书
- 2025年度耕地租赁与农业科技推广合同
- SCADA系统操作手册
- 渗透测试报告模版
- 老年人预防及控制养老院院内感染院内感染基本知识
- GB/T 10060-2023电梯安装验收规范
- TB编程从入门到进阶
- 教师沟通能力提升培训幼儿园家长沟通技巧教学课件
- 喀喇沁旗楼子店乡上烧锅白石矿石灰岩矿2022年度矿山地质环境治理计划书
- 第三单元名著导读《骆驼祥子》课件部编版语文七年级下册
- 高老师讲语文-灯笼-部编版
- 事业单位个人德能勤绩廉工作总结(2篇)
- 《英语词汇学》课程教学大纲
评论
0/150
提交评论