《快捷键和控制条文档资料》由会员分享,可在线阅读,更多相关《快捷键和控制条文档资料(77页珍藏版)》请在金锄头文库上搜索。
1、第第4章章 菜单、快捷键和菜单、快捷键和控制条控制条 内容摘要:1.菜单2.快捷菜单3.动态生成菜单4.工具条5.状态条返回目录菜单基础知识菜单基础知识n nWindows应用程序中除了客户区外还有非客户区。非客户区包括窗口的边框、标题栏、菜单栏、工具栏、状态栏和滚动条。其中菜单栏 、工具栏和状态栏是用户与应用程序进行交互的重要工具。菜菜 单单n n几乎所用的Windows应用程序都会使用到菜单,它为用户提供了操作应用程序需要的命令,是应用程序中可操作命令的集合。菜单分为两类:一类是依附于框架窗口的一般菜单,包括主菜单和子菜单。菜菜 单单n n主菜单是最高层的菜单,子菜单是从主菜单下拉出的菜单
2、,其位置都是固定的;另一类是弹出式菜单,也称为快捷菜单,是单击鼠标右键后,在光标位置出现的浮动式菜单。n n添加新菜单项添加新菜单项 n n编辑菜单项的属性编辑菜单项的属性 菜菜 单单n n删除菜单项删除菜单项 n n添加菜单消息处理函数添加菜单消息处理函数 n n启用和禁用菜单命令启用和禁用菜单命令 n n复选和单选标记菜单命令复选和单选标记菜单命令 n n创建弹出式菜单创建弹出式菜单 n n快捷键快捷键 添加新菜单项添加新菜单项n n应用AppWizard创建的应用程序菜单栏。n n在多文档界面下增加了一个“窗口”菜单项。添加新菜单项添加新菜单项n n用户往往不满足于AppWizard自动
3、生成的菜单项,比如创建文件翻译系统中的菜单栏时,除以上菜单项外可能还需要对翻译语言提供选择菜单项。这时就需要用户根据自己的实际需要手动为菜单栏添加菜单项。编辑菜单项的属性编辑菜单项的属性 n n在为菜单项添加名称时,系统已经自动打开一个名为“Menu Item Properties” 的对话框。输入的菜单项名称将会出现在“标题”文本框处。编辑菜单项的属性编辑菜单项的属性n n该对话框中各选项的含义分别是:n n“ID”文本框:菜单项的唯一标识,可由系统生成,也可由用户自定义。n n“标题”文本框:用户可见的菜单项名称。编辑菜单项的属性编辑菜单项的属性编辑菜单项的属性编辑菜单项的属性n n“ “
4、暂停暂停” ”下拉列表框:选中相应菜单后就退出其下拉列表框:选中相应菜单后就退出其所在的菜单。所在的菜单。n n“ “提示提示” ”文本框:鼠标移动到相应菜单处时,在文本框:鼠标移动到相应菜单处时,在窗口状态栏会出现提示信息。窗口状态栏会出现提示信息。例题分析例题分析4.1 菜单学习目标1. 响应菜单消息2. 控制菜单状态3. 使用快捷键3.13.1返回第4章程序的实现步骤程序的实现步骤1 1、利用、利用、利用、利用AppWizardAppWizard生成程序框架生成程序框架生成程序框架生成程序框架( (MenuTestMenuTest) )2 2、编辑资源、编辑资源、编辑资源、编辑资源 3
5、3、加入菜单消息处理函数、加入菜单消息处理函数、加入菜单消息处理函数、加入菜单消息处理函数 4 4、菜单命令的更新控制、菜单命令的更新控制、菜单命令的更新控制、菜单命令的更新控制 步骤步骤1 生成程序框架生成程序框架(MenuTest)1. 1.项目名称项目名称: : MenuTestMenuTest2. 2.选择单文档界面应用程序(选择单文档界面应用程序(Single documentSingle document)步骤步骤2 编辑资源编辑资源1. 1.编辑菜单资源编辑菜单资源编辑菜单资源编辑菜单资源 画图画图画图画图 Pop-up Pop-up 选中选中选中选中 Caption ID Pr
6、ompt Caption ID Prompt 矩形矩形矩形矩形(&R)(&R)tCtrl+RtCtrl+R ID_DRAW_RECT ID_DRAW_RECT 在视图中画矩形在视图中画矩形在视图中画矩形在视图中画矩形 椭圆椭圆椭圆椭圆(&C)(&C)tAlt+CtAlt+C ID_DRAW_CIRCLE ID_DRAW_CIRCLE 在视图中画椭圆在视图中画椭圆在视图中画椭圆在视图中画椭圆 2. 2.编辑快捷键资源编辑快捷键资源编辑快捷键资源编辑快捷键资源IDID Modifiers ModifiersKey Key ID_DRAW_RECT Ctrl ID_DRAW_RECT Ctrl R
7、R ID_DRAW_CIRCL Alt CID_DRAW_CIRCL Alt C步骤步骤3 加入菜单消息处理函数加入菜单消息处理函数 Class Name Objects IDs Messages1. 1.CMenuTestViewCMenuTestView ID_DRAW_RECT COMMAND ID_DRAW_RECT COMMAND2. 2.CMenuTestViewCMenuTestView ID_DRAW_ CIRCLE COMMAND ID_DRAW_ CIRCLE COMMANDvoidvoidCMenuTestView:OnDrawRectCMenuTestView:OnDr
8、awRect()() CClientDCCClientDCdc(this);dc(this);dc.Rectangle(50,50,200,150);dc.Rectangle(50,50,200,150); voidvoidCMenuTestView:OnDrawCircleCMenuTestView:OnDrawCircle()() CClientDCCClientDCdc(this);dc(this);dc.Ellipse(250,50,400,150);dc.Ellipse(250,50,400,150); 步骤步骤4 菜单命令的更新控制菜单命令的更新控制 1. 1. 在画图在画图 菜单
9、中再添加两个菜单项菜单中再添加两个菜单项Caption ID Prompt Caption ID Prompt 允许画矩形允许画矩形 ID_DRAW_ENABLE - ID_DRAW_ENABLE - 禁止画矩形禁止画矩形 ID_DRAW_DISABLE -ID_DRAW_DISABLE -2. 2.在视类中添加一个记录当前在视类中添加一个记录当前“ “矩形矩形” ”菜单项状态的变菜单项状态的变量量BOOL m_Enable;BOOL m_Enable; 3. 3. 在构造函数中初始化数据成员在构造函数中初始化数据成员m_Enablem_Enable m_ Enable =TRUE;m_ En
10、able =TRUE;步骤步骤4 菜单命令的更新控制菜单命令的更新控制 4. 4. 添加添加 菜单响应函数菜单响应函数Class Name Objects IDs Messages1. 1.CMenuTestViewCMenuTestView ID_DRAW_ENABLE COMMAND ID_DRAW_ENABLE COMMAND2. 2.CMenuTestViewCMenuTestView ID_DRAW_ DISABLE COMMAND ID_DRAW_ DISABLE COMMAND3. 3.CMenuTestViewCMenuTestView ID_DRAW_RECT UPDATE_
11、COMMAND_UI ID_DRAW_RECT UPDATE_COMMAND_UI 4. 4.CMenuTestViewCMenuTestView ID_DRAW_ENABLE UPDATE_COMMAND_UI ID_DRAW_ENABLE UPDATE_COMMAND_UI 5. 5.CMenuTestViewCMenuTestView ID_DRAW_ DISABLE UPDATE_COMMAND_UI ID_DRAW_ DISABLE UPDATE_COMMAND_UI voidvoidCMenuTestView:OnUpdateDrawRect(CCmdUICMenuTestView
12、:OnUpdateDrawRect(CCmdUI* *pCmdUIpCmdUI) ) pCmdUIpCmdUI-Enable(m_Enable);-Enable(m_Enable); 步骤步骤4 菜单命令的更新控制菜单命令的更新控制voidvoidCMenuTestView:OnDrawDisableCMenuTestView:OnDrawDisable()() m_Enable=FALSE;m_Enable=FALSE; void void CMenuTestView:OnDrawEnableCMenuTestView:OnDrawEnable() () m_Enable = TRUE;m_
13、Enable = TRUE; voidvoidCMenuTestView:OnUpdateDrawEnable(CCmdUICMenuTestView:OnUpdateDrawEnable(CCmdUI* *pCmdUIpCmdUI) ) pCmdUIpCmdUI-SetCheck(m_EnableSetCheck(m_Enable?1:0);?1:0); voidvoidCMenuTestView:OnUpdateDrawDisable(CCmdUICMenuTestView:OnUpdateDrawDisable(CCmdUI* *pCmdUIpCmdUI) ) pCmdUIpCmdUI-
14、SetCheck(m_EnableSetCheck(m_Enable?0:1);?0:1); 基本知识基本知识1、pCmdUI-Enable(true | false);说明:使用户界面对象有效或无效2、pCmdUI-SetCheck( 1| 0);说明:设置或取消选中用户界面对象3、使用COMMAND消息响应菜单项的选择事件 4、 UPDATE_COMMAND_UI消息控制菜使用单项状态 4.2 快捷菜单快捷菜单 学习目标1. 实现快捷菜单返回第4章程序的实现步骤程序的实现步骤1、编辑快捷菜单资源2、显示跟踪菜单3、添加菜单响应函数4、实现对话框功能步骤步骤1 编辑快捷菜单资源编辑快捷菜单资
15、源添加菜单添加菜单添加菜单添加菜单(IDR_POPUP_MENU )(IDR_POPUP_MENU )Popup1 Popup1 选中选中选中选中Pop-up Pop-up Caption IDCaption ID 编辑矩形坐标编辑矩形坐标编辑矩形坐标编辑矩形坐标 ID_EDIT_RECT ID_EDIT_RECT 编辑椭圆坐标编辑椭圆坐标编辑椭圆坐标编辑椭圆坐标 ID_EDIT_CIRCLEID_EDIT_CIRCLE 4.24.2步骤步骤2 显示快捷菜单显示快捷菜单添加响应函数Class Name Class Name ObjectsIDsObjectsIDs Messages Messa
16、gesCMainFrameCMainFrame CMainFrameCMainFrame WM_CONTEXTMENU WM_CONTEXTMENU 4.24.2voidvoidCMainFrame:OnContextMenu(CWndCMainFrame:OnContextMenu(CWnd* *pWndpWnd, ,CPointCPointpoint)point) /TODO:Addyourmessagehandlercodehere/TODO:AddyourmessagehandlercodehereCMenuCMenumenu;menu; if(menu.LoadMenu(IDR_PO
17、PUP_MENUif(menu.LoadMenu(IDR_POPUP_MENU) ) CMenuCMenu* *pPopuppPopup=menu.GetSubMenu(0);=menu.GetSubMenu(0); pPopuppPopup-TrackPopupMenuTrackPopupMenu (TPM_LEFTALIGN|TPM_RIGHTBUTTONTPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);,point.x,point.y,this); 步骤步骤2 显示快捷菜单显示快捷菜单4.24.2步骤步骤3 添加菜单消息处理函数添加菜
18、单消息处理函数 (1) 编辑对话框资源静态文本框,静态文本框,IDC_STATIC,左上角坐标(左上角坐标(X1,Y1)静态文本框,静态文本框,IDC_STATIC,右下角坐标(右下角坐标(X2,Y2)编辑框,编辑框,IDC_EDIT_X1编辑框,编辑框,IDC_EDIT_Y1编辑框,编辑框,IDC_EDIT_X2编辑框,编辑框,IDC_EDIT_Y2按扭控件,按扭控件,IDOK,确定确定按扭控件,按扭控件,IDCANCEL,取消取消 4.24.2步骤步骤3 添加菜单消息处理函数添加菜单消息处理函数 (2)为对话框添加控件关联变量 IDC_EDIT_X1IDC_EDIT_X1,intint,m
19、_nX1m_nX1IDC_EDIT_Y1IDC_EDIT_Y1,intint,m_nY1m_nY1IDC_EDIT_X2IDC_EDIT_X2,intint,m_nX2m_nX2IDC_EDIT_Y2IDC_EDIT_Y2,intint,m_nY2m_nY2(3)在主框架中加入变量并初始化 intint m_nRectLeftm_nRectLeft; ;intint m_nRectTopm_nRectTop; ;intint m_nRectRightm_nRectRight; ;intint m_nRectBottomm_nRectBottom; ;intint m_nCircleLeftm_
20、nCircleLeft; ;intint m_nCircleTopm_nCircleTop; ;intint m_nCircleRightm_nCircleRight; ;intint m_nCircleBottomm_nCircleBottom; ; 4.24.2CMainFrame:CMainFrameCMainFrame:CMainFrame() () /TODO:addmemberinitializationcodehere/TODO:addmemberinitializationcodeherem_nRectLeftm_nRectLeft=50;=50;m_nRectTopm_nRe
21、ctTop=50;=50;m_nRectRightm_nRectRight=200;=200;m_nRectBottomm_nRectBottom=150;=150;m_nCircleLeftm_nCircleLeft=50;=50;m_nCircleTopm_nCircleTop=50;=50;m_nCircleRightm_nCircleRight=200;=200;m_nCircleBottomm_nCircleBottom=150;=150; 步骤步骤3 添加菜单消息处理函数添加菜单消息处理函数 4.24.2voidvoidCMenuTestView:OnDrawRectCMenuTe
22、stView:OnDrawRect()() CMainFrame*pMainFrame=(CMainFrame*)AfxGetApp()-GetMainWnd();CClientDCCClientDCdc(this);dc(this);dc.Rectangle(pMainFramedc.Rectangle(pMainFrame-m_nRectLeft,pMainFramem_nRectLeft,pMainFrame-m_nRectTopm_nRectTop, ,pMainFramepMainFrame-m_nRectRight,pMainFramem_nRectRight,pMainFrame
23、-m_nRectBottomm_nRectBottom);); voidvoidCMenuTestView:OnDrawCircleCMenuTestView:OnDrawCircle()() CMainFrame*pMainFrame=(CMainFrame*)AfxGetApp()-GetMainWnd();CClientDCCClientDCdc(this);dc(this);dc.Ellipse(pMainFramedc.Ellipse(pMainFrame-m_nCircleLeft,pMainFramem_nCircleLeft,pMainFrame-m_nCircleTopm_n
24、CircleTop, ,pMainFramepMainFrame-m_nCircleRight,pMainFramem_nCircleRight,pMainFrame-m_nCircleBottomm_nCircleBottom);); 步骤步骤3 添加菜单消息处理函数添加菜单消息处理函数 (4) 修改画图函数4.24.2步骤步骤3 添加菜单消息处理函数添加菜单消息处理函数 (5)加入菜单消息处理函数 voidCMenuTestView:OnEditRect()CDlgEditdlg(1);dlg.DoModal();voidCMenuTestView:OnEditCircle()CDlgEd
25、itdlg(2);dlg.DoModal();4.24.2步骤步骤4 实现对话框功能实现对话框功能(1)修改构造函数 CDlgEdit:CDlgEdit(inttype,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_INITm_nType=type;(2)添加确定命令按扭响应函数OnOK() 4.24.2步步骤骤4 实实现现对对话话框框功功能能voidCDlgEdit:OnOK()UpdateData(TR
26、UE);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;elseif(m_nType=2)pMainFrame-m_nCircleLeft=m_nX1;pMainFrame-m_nCircleTop=m_nY1;pMainFrame-m_nCircleRight=m
27、_nX2;pMainFrame-m_nCircleBottom=m_nY2;CDialog:OnOK();4.24.2基本知识基本知识1. 1.OnContextMOnContextMenu()函数 2. 2.CMenu类(1 1)LoadMenuLoadMenu()函数:载入菜单资源()函数:载入菜单资源(2 2)TrackPopupMenuTrackPopupMenu()函函数数:在在指指定定位位置置弹出菜单。弹出菜单。3. 3.AfxGetAppAfxGetApp() ()函数4. 4.CWinApp 类的GetMainWndGetMainWnd() ()函数4.24.2弹出菜单的显示位
28、置弹出菜单的显示位置弹出菜单的显示位置弹出菜单的显示位置说明说明说明说明TPM_CENTERALIGNTPM_CENTERALIGN菜单在屏幕的显示位置,其水平中菜单在屏幕的显示位置,其水平中菜单在屏幕的显示位置,其水平中菜单在屏幕的显示位置,其水平中心位置由心位置由心位置由心位置由X X值决定值决定值决定值决定TPM_LEFTALIGNTPM_LEFTALIGN菜单在屏幕的显示位置,其左侧位菜单在屏幕的显示位置,其左侧位菜单在屏幕的显示位置,其左侧位菜单在屏幕的显示位置,其左侧位置由置由置由置由X X值决定值决定值决定值决定TPM_RIGHTALIGNTPM_RIGHTALIGN菜单在屏幕的
29、显示位置,其右侧位菜单在屏幕的显示位置,其右侧位菜单在屏幕的显示位置,其右侧位菜单在屏幕的显示位置,其右侧位置由置由置由置由X X值决定值决定值决定值决定TPM_LEFTBUTTONTPM_LEFTBUTTON菜单在单击鼠标左键时弹出菜单在单击鼠标左键时弹出菜单在单击鼠标左键时弹出菜单在单击鼠标左键时弹出TPM_RIGHTBUTTONTPM_RIGHTBUTTON菜单在单击鼠标右键时弹出菜单在单击鼠标右键时弹出菜单在单击鼠标右键时弹出菜单在单击鼠标右键时弹出形式参数说明形式参数说明4.3 动态菜单 学习目标1. 菜单动态增加与删除2. 用户自定义消息3. 动态菜单消息响应4.34.3返回第4章
30、程序的实现步骤程序的实现步骤1. 1.编辑菜单资源2. 2.添加菜单响应函数3. 3.加入动态菜单响应函数4.34.3步骤步骤1 编辑菜单资源编辑菜单资源为菜单为菜单(IDR_POPUP_MENU )(IDR_POPUP_MENU )添加两个菜单项:添加两个菜单项:Caption ID1.Seprator1.Seprator2. 2.增加椭圆控制菜单增加椭圆控制菜单 ID_ADD_MENU ID_ADD_MENU 3. 3.删除椭圆控制菜单删除椭圆控制菜单 ID_DELETE_MENU ID_DELETE_MENU 4.34.3步骤步骤2 添加菜单响应函数添加菜单响应函数1. 1. OnAdd
31、MenuOnAddMenu()()2. 2. OnDeleteMenuOnDeleteMenu()() 4.34.3步骤步骤2 添加菜单响应函数添加菜单响应函数4.34.3voidCMainFrame:OnAddMenu()/TODO:AddyourcommandhandlercodehereCStringmenu2;menu0=允许画椭圆;menu1=禁止画椭圆;CWnd*pMainFrame=AfxGetMainWnd();CMenu*pMenuDyna=NULL;CMenu*pMenu=NULL;CMenu*pTopMenu=pMainFrame-GetMenu();intiPos;fo
32、r(iPos=pTopMenu-GetMenuItemCount()-1;iPos=0;iPos-)pMenu=pTopMenu-GetSubMenu(iPos);if(pMenu&pMenu-GetMenuItemID(0)=ID_DRAW_RECT)pMenuDyna=pMenu;break;for(iPos=pMenuDyna-GetMenuItemCount()-1;iPos=5;iPos-)pMenuDyna-DeleteMenu(iPos,MF_BYPOSITION);for(inti=0;iAppendMenu(MF_STRING,WM_USER+10+i,menui);步骤步骤
33、2 添加菜单响应函数添加菜单响应函数4.34.3voidCMainFrame:OnDeleteMenu()/TODO:AddyourcommandhandlercodehereCWnd*pMainFrame=AfxGetMainWnd();CMenu*pMenuDyna=NULL;CMenu*pMenu=NULL;CMenu*pTopMenu=pMainFrame-GetMenu();intiPos;for(iPos=pTopMenu-GetMenuItemCount()-1;iPos=0;iPos-)pMenu=pTopMenu-GetSubMenu(iPos);if(pMenu&pMenu
34、-GetMenuItemID(0)=ID_DRAW_RECT)pMenuDyna=pMenu;break;for(iPos=pMenuDyna-GetMenuItemCount()-1;iPos=5;iPos-)pMenuDyna-DeleteMenu(iPos,MF_BYPOSITION);步骤步骤3 添加动态菜单响应函数添加动态菜单响应函数1. 1.在类在类CMainFrameCMainFrame中增加一个变量并初始化中增加一个变量并初始化intint m_SelectMenum_SelectMenu;当当m_SelectMenum_SelectMenu为为0 0时,第一项为选中状态,允许
35、画时,第一项为选中状态,允许画椭圆。否则第二项为选中状态,禁止画椭圆。椭圆。否则第二项为选中状态,禁止画椭圆。4.34.3CMainFrame:CMainFrame()/ TODO: add member initialization code herem_SelectMenu =0; 步骤步骤3 添加动态菜单响应函数添加动态菜单响应函数2. 重载主框架类的OnCmdMsg()函数 Project: MenuTestClass Name:CMainFrameObjects IDs:CMainFrameMessages: OnCmdMsg4.34.34.34.3步骤步骤3 添加动态菜单响应函数添
36、加动态菜单响应函数BOOLCMainFrame:OnCmdMsg(UINTnID,intnCode,void*pExtra,AFX_CMDHANDLERINFO*pHandlerInfo)if(pHandlerInfo=NULL)for(inti=0;iSetCheck(1);elsepCmdUI-SetCheck(0);pCmdUI-Enable(true); 步骤步骤3 添加动态菜单响应函数添加动态菜单响应函数4.为椭圆菜单项加入UPDATE_COMMAND_UI消息处理函数 4.34.3void CMainFrame:OnUpdateDrawCircle(CCmdUI* pCmdUI)
37、/ TODO: Add your command update UI handler code hereif(m_nSelectMenu = 0)pCmdUI-Enable(true);elsepCmdUI-Enable(false); 基本知识基本知识1. 1.CWnd 类:GetMenuGetMenu() () 函数 2. 2.CMenu类(1 1)GetMenuItemCountGetMenuItemCount() ()函数函数(2 2)GetMenuItemIDGetMenuItemID() ()函数函数(3 3)DeleteMenuDeleteMenu()()函数函数(4 4)App
38、endMenuAppendMenu()()函数函数3. 3.OnCmdMsg消息4.34.3工工 具具 栏栏 工工 具具 栏栏n n工具栏还具有工具提示功能,当用户将鼠标光标停留在对应工具按钮上几秒钟,工具提示便会出现在工具栏按钮下方的文本框中。n n向工具栏添加按钮向工具栏添加按钮 n n添加工具栏间隔添加工具栏间隔 工工 具具 栏栏n n删除工具栏按钮删除工具栏按钮 n n设置按钮属性设置按钮属性 n n启用和禁用工具栏按钮启用和禁用工具栏按钮 向工具栏添加按钮向工具栏添加按钮n n向工具栏添加按钮,Visual C+中主要体现为绘制工具栏按钮的位图,该位图以BMP文件格式保存。工具栏位图
39、是一系列覆盖工具栏按钮的图形,每个按钮对应一个图形。在默认状态下,每个图形为16像素宽,15像素高。向工具栏添加按钮向工具栏添加按钮添加工具栏间隔添加工具栏间隔 n n工具栏中的按钮从功能上可分为几大类,为了进行区别,往往在不同的类别之间使用间隔符号进行隔离。n n为工具栏添加间隔的方法非常简单,只需选择空白工具栏按钮,并轻轻向右拖动一点,即为工具栏添加了一个间隔。删除工具栏按钮删除工具栏按钮 n nAppWizard自动生成的工具栏按钮,在实际应用程序中可能会显得多余,这时可将其删除。设置按钮属性设置按钮属性 n n工具栏按钮也有自己的属性,其属性在“Toolbar Button Prope
40、rties” 对话框中进行设置,双击对应的工具栏按钮,打开属性对话框。设置按钮属性设置按钮属性n n对话框中各选项的含义如下:n n“ “ID”ID”下拉列表框:输入或选择与按钮对应的下拉列表框:输入或选择与按钮对应的IDID号。号。n n“ “D D宽宽” ”文本框:按钮显示的宽度,单位为文本框:按钮显示的宽度,单位为“ “像像素素” ”,默认值为,默认值为1616。设置按钮属性设置按钮属性n n“ “H H高高” ”文本框:按钮显示的高度,单位为文本框:按钮显示的高度,单位为“ “像像素素” ”,默认值为,默认值为1515。n n“ “MM提示提示” ”文本框:输入的信息会在程序运行时文本
41、框:输入的信息会在程序运行时在状态栏中进行显示。在状态栏中进行显示。n n【例6-8】 为【例6-7】中的工具栏按钮编辑属性。(光盘:第6章例6_16_10)启用和禁用工具栏按钮启用和禁用工具栏按钮 n n与菜单项操作一样,用户没有为工具栏按钮写入与菜单项操作一样,用户没有为工具栏按钮写入消息处理函数或者用户自定义按钮未与某个已有消息处理函数或者用户自定义按钮未与某个已有消息处理函数的菜单项对应时,工具栏按钮为灰消息处理函数的菜单项对应时,工具栏按钮为灰色,即禁用状态。色,即禁用状态。n n同样,也可在类中添加一个用户界面处理函数,同样,也可在类中添加一个用户界面处理函数,根据应用程序的某些条
42、件,可有条件地启用和禁根据应用程序的某些条件,可有条件地启用和禁用一个工具栏按钮。用一个工具栏按钮。4.4 工具条 学习目标1. 自定义工具条2. 2.在工具条中添加控件4.44.4返回第4章程序的实现步骤程序的实现步骤1. 1.编辑工具条资源2. 2.创建工具条 3. 3.在工具条上添加控件4. 4.加入控件响应函数 4.44.4步骤步骤1 编辑工具条资源编辑工具条资源添加工具条添加工具条(IDR_MYTOOLBAR )(IDR_MYTOOLBAR ): 4.44.4ID_DRAW_RECTID_DRAW_CIRCLEID_DRAW_LINEID_COMBOBOX工具条含四个工具按扭,其中前
43、两个与菜单“画图”的前两个菜单项的ID号相同,第三个按扭用于画直线,第四个按扭用来显示组合框 。步骤步骤步骤步骤2 2 创建工具条创建工具条创建工具条创建工具条1. 1.在类在类CmainFrameCmainFrame中定义工具条数据成员中定义工具条数据成员: : CToolBarCToolBar m_wndMyToolBarm_wndMyToolBar; ;2. 2.在类在类CMainFrameCMainFrame的的OnCreateOnCreate函数中加入以下代码函数中加入以下代码 : : 4.44.4if(!m_wndMyToolBar.CreateEx(this,TBSTYLE_FL
44、AT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndMyToolBar.LoadToolBar(IDR_MYTOOLBAR)TRACE0(Failedtocreatetoolbarn);return-1;/failtocreate.m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndMyToolBar);步骤步骤步骤步骤
45、2 2 创建工具条创建工具条创建工具条创建工具条3. 3. 添加画线响应函数添加画线响应函数 4.44.4voidCMenuTestView:OnDrawLine()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);dc.MoveTo(20,20);dc.LineTo(200,200);步骤步骤步骤步骤3 3 在工具条上添加控件在工具条上添加控件在工具条上添加控件在工具条上添加控件 1. 1.在类在类CMainFrameCMainFrame中定义数据成员中定义数据成员CComboBoxCComboBox m_ComboBoxm_Combo
46、Box; ; 2. 2. 在在CMainFrameCMainFrame的的OnCreateOnCreate函数中加入代码函数中加入代码 4.44.4CRectrect;m_wndMyToolBar.SetButtonInfo(3,ID_COMBOBOX,TBBS_SEPARATOR,160);m_wndMyToolBar.GetItemRect(3,&rect);rect.bottom+=100;if(!m_ComboBox.Create(CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect,&m_wndMyToolBar,ID
47、_COMBOBOX)return-1;m_ComboBox.AddString(FirstItem);m_ComboBox.AddString(SecondItem);m_ComboBox.AddString(ThirdItem);m_ComboBox.SetCurSel(0);步骤步骤4 加入组合框响应函数加入组合框响应函数 1. 1.定位到定位到MainFrm.hMainFrm.h中类的定义处,在其中添加消息响应函中类的定义处,在其中添加消息响应函数的原形:数的原形: afx_msgafx_msg void void OnSelchangeComboOnSelchangeCombo();(
48、);2. 2.定位到定位到MainFrm.cppMainFrm.cpp中消息映射宏的定义处,在其中消息映射宏的定义处,在其中添加中添加ComboBoxComboBox控件的控件的ON_CBNSELCHANGEON_CBNSELCHANGE消消息的映射宏:息的映射宏:ON_CBN_SELCHANGE(ID_COMBOBOX,OnSelcON_CBN_SELCHANGE(ID_COMBOBOX,OnSelchangeCombohangeCombo) )4.44.4步骤步骤4 加入组合框响应函数加入组合框响应函数 3. 3. 在在MainFrm.cppMainFrm.cpp中添加消息映射函数体:中添
49、加消息映射函数体:4.44.4voidCMainFrame:OnSelchangeCombo()CStringmess;intCurSel;CurSel=m_ComboBox.GetCurSel();mess=您选择了第;charNo3;itoa(CurSel,No,10);mess+=No;mess+=项!;MessageBox(mess,消息框,MB_OK|MB_ICONINFORMATION);基本知识基本知识1. 1.CToolBar 类: 1. 1.CreateExCreateEx() () 函数函数 2. 2.SetButtonInfoSetButtonInfo () () 3.
50、3.GetItemRectGetItemRect () () 2. 2.CComboBox 类1. 1. Create ()Create ()函数函数2. 2.AddStringAddString() ()函数函数3. 3.SetCurSelSetCurSel ()()函数函数3. 3.手工添加消息响应函数4.44.43.5 状态条 学习目标1. 在状态信息行显示信息 2. 2.在状态指示器 显示键盘状态4.54.5返回第4章程序的实现步骤程序的实现步骤1. 1.在文件在文件MainFrm.cppMainFrm.cpp中,找到状态条中,找到状态条indicatorsindicators数数组的
51、定义处添加代码组的定义处添加代码 2. 2.创建创建CtrlCtrl键和键和ShiftShift键状态指示器的字符串资源键状态指示器的字符串资源 3. 3.为状态条添加标识号为状态条添加标识号 4. 4.在函数在函数CMainFrame:OnCreateCMainFrame:OnCreate()()函数中,添加函数中,添加状态条的设置代码状态条的设置代码 5. 5.显示控制键状态显示控制键状态 6. 6.显示鼠标在视中的位置坐标显示鼠标在视中的位置坐标 4.54.5步骤步骤1 在在indicators数组中添加新元素数组中添加新元素4.54.5static UINT indicators =I
52、D_SEPARATOR, / status line indicatorID_SEPARATOR, /显示显示x坐标坐标ID_SEPARATOR, /显示显示x坐标坐标ID_INDICATOR_CTRL, /显示显示Ctrl键的状态键的状态ID_INDICATOR_SHIFT, /显示显示Shift键的状态键的状态ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;步骤步骤步骤步骤2 2 创建创建创建创建CtrlCtrl键和键和键和键和ShiftShift键状态指示器的字符串资键状态指示器的字符串资键状态指示器的字符串资键状态指示器的字符
53、串资源源源源 4.54.5在Workspace窗口中双击ResourceView标签的String Table,打开字符串资源编辑器。选中一个以ID_INDICATOR为开头的字符串资源,按Insert键,插入两个新的字符串资源: ID CaptionID_INDICATOR_CTRL CtrlID_INDICATOR_SHIFT Shift 步骤3 为状态条添加标识号 通过菜单View下的Resource Symbols菜单项,打开Resource Symbol对话框,单击New按扭,在Name中输入IDC_STATUSBAR,Value取默任值,单击OK按扭。 步骤步骤步骤步骤4 4 在函
54、数在函数在函数在函数CMainFrame:OnCreateCMainFrame:OnCreate()()()()函数中,函数中,函数中,函数中,添加状态条的设置代码添加状态条的设置代码添加状态条的设置代码添加状态条的设置代码 4.54.5if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)TRACE0(Failedtocreatestatusbarn);return-1;/failtocreatem_wndStatusBar.SetPane
55、Info(1,IDC_STATUSBAR,SBPS_POPOUT,50);m_wndStatusBar.SetPaneInfo(2,IDC_STATUSBAR,SBPS_POPOUT,50);步骤步骤步骤步骤5 5 显示控制键状态显示控制键状态显示控制键状态显示控制键状态 4.54.51. 在MainFrm.h文件中的类定义内加入消息响应函数的原形,并将成员m_wndStatusBar改成公用类型:public:CStatusBarm_wndStatusBar;afx_msgvoidOnUpdateKeyCtrl(CCmdUI*pCmdUI);afx_msgvoidOnUpdateKeyShi
56、ft(CCmdUI*pCmdUI);2. 在文件MainFrm.cpp消息映射宏的定义处添加两消息映射宏 ON_UPDATE_COMMAND_UI(ID_INDICATOR_CTRL,OnUpdateKeyCtrl)ON_UPDATE_COMMAND_UI(ID_INDICATOR_SHIFT,OnUpdateKeyShift)步骤步骤步骤步骤5 5 显示控制键状态显示控制键状态显示控制键状态显示控制键状态 4.54.53. 在文件MainFrm.cpp中添加消息映射函数体 voidCMainFrame:OnUpdateKeyCtrl(CCmdUI*pCmdUI)pCmdUI-Enable(:
57、GetKeyState(VK_CONTROL)Enable(:GetKeyState(VK_SHIFT)m_wndStatusBar.SetPaneText(1,PositionString);sprintf(PositionString,y:%d,point.y);MainFrame-m_wndStatusBar.SetPaneText(2,PositionString);CView:OnMouseMove(nFlags,point);基本知识基本知识1. 1.CStatusBar 类: 1. 1.SetPaneInfoSetPaneInfo() () 函数函数 2. 2.SetIndicatorsSetIndicators() ()函数函数3. 3.SetPaneTextSetPaneText() ()函数函数2. GetKeyState(VK_SHIFT)函数4.54.5返回第4章