《菜单快捷键和控制条.ppt》由会员分享,可在线阅读,更多相关《菜单快捷键和控制条.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章菜单、快捷键和控制条内容摘要:1.菜单2.快捷菜单3.动态生成菜单4.工具条5.状态条返回目录4.1 菜单菜单学习目标1.响应菜单消息2.控制菜单状态3.使用快捷键返回第4章程序的实现步骤1.利用利用AppWizardAppWizard生成程序框架生成程序框架(MenuTestMenuTest)2.编辑资源编辑资源 3.加入菜单消息处理函数加入菜单消息处理函数 4.菜单命令的更新控制菜单命令的更新控制 步骤1生成程序框架(MenuTest)1.项目名称项目名称:MenuTestMenuTest2.选择单文档界面应用程序(选择单文档界面应用程序(Single Single document
2、document)步骤2编辑资源1.编辑菜单资源编辑菜单资源 画图画图 Pop-up Pop-up 选中选中 Caption ID Caption ID Prompt Prompt 矩形矩形(&R)tCtrl+R ID_DRAW_RECT (&R)tCtrl+R ID_DRAW_RECT 在视中画矩形在视中画矩形 椭圆椭圆(&C)tAlt+C ID_DRAW_CIRCLE (&C)tAlt+C ID_DRAW_CIRCLE 在视中画椭圆在视中画椭圆 2.2.编辑快捷键资源编辑快捷键资源IDID Modifiers Modifiers Key Key ID_DRAW_RECT Ctrl ID_D
3、RAW_RECT Ctrl R R ID_DRAW_CIRCL Alt CID_DRAW_CIRCL Alt C步骤3加入菜单消息处理函数 Class Name Objects IDs Messages1.1.CMenuTestViewCMenuTestView ID_DRAW_RECT ID_DRAW_RECT COMMANDCOMMAND2.2.CMenuTestViewCMenuTestView ID_DRAW_ ID_DRAW_ CIRCLE CIRCLE COMMANDCOMMANDvoidCMenuTestView:OnDrawRect()voidCMenuTestView:OnD
4、rawRect()CClientDCdc(this);CClientDCdc(this);dc.Rectangle(50,50,200,150);dc.Rectangle(50,50,200,150);voidCMenuTestView:OnDrawCircle()voidCMenuTestView:OnDrawCircle()CClientDCdc(this);CClientDCdc(this);dc.Ellipse(250,50,400,150);dc.Ellipse(250,50,400,150);步骤4菜单命令的更新控制1.1.在画图在画图 菜单中再添加两个菜单项菜单中再添加两个菜单项
5、Caption ID Caption ID Prompt 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_Enable=TRUE;步骤4菜单命令的更新控制4.4.添加添加 菜单
6、响应函数菜单响应函数Class Name Objects IDs Messages1.1.CMenuTestViewCMenuTestView ID_DRAW_ENABLE COMMANDID_DRAW_ENABLE COMMAND2.2.CMenuTestViewCMenuTestView ID_DRAW_ DISABLE ID_DRAW_ DISABLE COMMAND COMMAND3.3.CMenuTestViewCMenuTestView ID_DRAW_RECT ID_DRAW_RECT UPDATE_COMMAND_UI UPDATE_COMMAND_UI 4.4.CMenuTe
7、stViewCMenuTestView 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 voidCMenuTestView:OnUpdateDrawRect(CCmdUI*pCmdUI)voidCMenuTestView:OnUpdateDrawRect(CCmdUI*pCmdUI)pCmdUI-Enable(m
8、_Enable);pCmdUI-Enable(m_Enable);步骤4菜单命令的更新控制voidCMenuTestView:OnDrawDisable()voidCMenuTestView:OnDrawDisable()m_Enable=FALSE;m_Enable=FALSE;void CMenuTestView:OnDrawEnable()void CMenuTestView:OnDrawEnable()m_Enable=TRUE;m_Enable=TRUE;voidCMenuTestView:OnUpdateDrawEnable(CCmdUI*pCmdUI)voidCMenuTestV
9、iew:OnUpdateDrawEnable(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_Enable?1:0);pCmdUI-SetCheck(m_Enable?1:0);voidCMenuTestView:OnUpdateDrawDisable(CCmdUI*pCmdUI)voidCMenuTestView:OnUpdateDrawDisable(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_Enable?0:1);pCmdUI-SetCheck(m_Enable?0:1);基本知识1.pCmdUI-Enable(true|false);2.pCmdU
10、I-SetCheck(1|0);3.使用COMMAND消息响应菜单项的选择事件 4.UPDATE_COMMAND_UI消息控制菜使用单项状态 4.2快捷菜单学习目标1.实现快捷菜单返回第4章程序的实现步骤1.编辑快捷菜单资源2.显示跟踪菜单3.添加菜单响应函数4.实现对话框功能步骤1编辑快捷菜单资源添加菜单(IDR_POPUP_MENU)Popup1 Popup1 选中选中Pop-up Pop-up Caption IDCaption ID 编辑矩形坐标编辑矩形坐标 ID_EDIT_RECT ID_EDIT_RECT 编辑椭圆坐标编辑椭圆坐标 ID_EDIT_CIRCLE ID_EDIT_CI
11、RCLE 步骤2显示快捷菜单添加响应函数Class Name ObjectsIDs MessagesClass Name ObjectsIDs MessagesCMainFrame CMainFrame CMainFrame CMainFrame WM_CONTEXTMENUWM_CONTEXTMENU voidCMainFrame:OnContextMenu(CWnd*pWnd,CPointpoint)voidCMainFrame:OnContextMenu(CWnd*pWnd,CPointpoint)/TODO:Addyourmessagehandlercodehere/TODO:Addy
12、ourmessagehandlercodehereCMenumenu;CMenumenu;if(menu.LoadMenu(IDR_POPUP_MENU)if(menu.LoadMenu(IDR_POPUP_MENU)CMenu*pPopup=menu.GetSubMenu(0);CMenu*pPopup=menu.GetSubMenu(0);pPopup-TrackPopupMenupPopup-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTONTPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);,po
13、int.x,point.y,this);步骤2显示快捷菜单步骤3添加菜单消息处理函数(1)编辑对话框资源静态文本框,IDC_STATIC,左上角坐标(X1,Y1)静态文本框,IDC_STATIC,右下角坐标(X2,Y2)编辑框,IDC_EDIT_X1编辑框,IDC_EDIT_Y1编辑框,IDC_EDIT_X2编辑框,IDC_EDIT_Y2按扭控件,IDOK,确定按扭控件,IDCANCEL,取消 步骤3添加菜单消息处理函数(2)为对话框添加控件关联变量 IDC_EDIT_X1IDC_EDIT_X1,intint,m_nX1m_nX1IDC_EDIT_Y1IDC_EDIT_Y1,intint,m_
14、nX1m_nX1IDC_EDIT_X2IDC_EDIT_X2,intint,m_nX1m_nX1IDC_EDIT_Y2IDC_EDIT_Y2,intint,m_nX1m_nX1(3)在主框架中加入变量并初始化 int m_nRectLeft;int m_nRectLeft;int m_nRectTop;int m_nRectTop;int m_nRectRight;int m_nRectRight;int m_nRectBottom;int m_nRectBottom;int m_nCircleLeft;int m_nCircleLeft;int m_nCircleTop;int m_nCir
15、cleTop;int m_nCircleRight;int m_nCircleRight;int m_nCircleBottomint m_nCircleBottom;CMainFrame:CMainFrame()CMainFrame:CMainFrame()/TODO:addmemberinitializationcodehere/TODO:addmemberinitializationcodeherem_nRectLeft=50;m_nRectLeft=50;m_nRectTop=50;m_nRectTop=50;m_nRectRight=200;m_nRectRight=200;m_nR
16、ectBottom=150;m_nRectBottom=150;m_nCircleLeft=50;m_nCircleLeft=50;m_nCircleTop=50;m_nCircleTop=50;m_nCircleRight=200;m_nCircleRight=200;m_nCircleBottom=150;m_nCircleBottom=150;步骤3添加菜单消息处理函数voidCMenuTestView:OnDrawRect()voidCMenuTestView:OnDrawRect()CMainFrame*pMainFrame=(CMainFrame*)AfxGetApp()-GetM
17、ainWnd();CClientDCdc(this);CClientDCdc(this);dc.Rectangle(pMainFrame-m_nRectLeft,pMainFrame-m_nRectTop,dc.Rectangle(pMainFrame-m_nRectLeft,pMainFrame-m_nRectTop,pMainFrame-m_nRectRight,pMainFrame-m_nRectBottom);pMainFrame-m_nRectRight,pMainFrame-m_nRectBottom);voidCMenuTestView:OnDrawCircle()voidCMe
18、nuTestView:OnDrawCircle()CMainFrame*pMainFrame=(CMainFrame*)AfxGetApp()-GetMainWnd();CClientDCdc(this);CClientDCdc(this);dc.Ellipse(pMainFrame-m_nCircleLeft,pMainFrame-m_nCircleTop,dc.Ellipse(pMainFrame-m_nCircleLeft,pMainFrame-m_nCircleTop,pMainFrame-m_nCircleRight,pMainFrame-m_nCircleBottom);pMain
19、Frame-m_nCircleRight,pMainFrame-m_nCircleBottom);步骤3添加菜单消息处理函数(4)修改画图函数步骤3添加菜单消息处理函数(5)加入菜单消息处理函数 voidCMenuTestView:OnEditRect()CDlgEditdlg(1);dlg.DoModal();voidCMenuTestView:OnEditCircle()CDlgEditdlg(2);dlg.DoModal();步骤4实现对话框功能(1)修改构造函数 CDlgEdit:CDlgEdit(inttype,CWnd*pParent/*=NULL*/):CDialog(CDlgE
20、dit: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实现对话框功能voidCDlgEdit:OnOK()UpdateData(TRUE);CMainFrame*pMainFrame=(CMainFrame*)AfxGetApp()-GetMainWnd();if(m_nType=1)pMainFrame-m_nRectLeft=m_nX1;pMainFrame-m_nRectTop=m_nY1;pMai
21、nFrame-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_nX2;pMainFrame-m_nCircleBottom=m_nY2;CDialog:OnOK();基本知识1.OnContextMOnContextMenu()函数 2.CMenu类1.LoadMenuLoadMenu()()函数函数2.TrackPopupMenuT
22、rackPopupMenu()()函数函数3.AfxGetAppAfxGetApp()()函数4.CWinApp 类的GetMainWndGetMainWnd()()函数4.3 动态菜单动态菜单 学习目标1.菜单动态增加与删除2.用户自定义消息3.动态菜单消息响应返回第4章程序的实现步骤1.编辑菜单资源2.添加菜单响应函数3.加入动态菜单响应函数步骤1编辑菜单资源为菜单为菜单(IDR_POPUP_MENU)(IDR_POPUP_MENU)添加两个菜单项:添加两个菜单项:Caption ID1.Seprator1.Seprator2.2.增加椭圆控制菜单增加椭圆控制菜单 ID_ADD_MENU
23、ID_ADD_MENU 3.3.删除椭圆控制菜单删除椭圆控制菜单 ID_DELETE_MENU ID_DELETE_MENU 步骤2添加菜单响应函数1.OnAddMenu1.OnAddMenu()()2.OnDeleteMenu2.OnDeleteMenu()()步骤2添加菜单响应函数voidCMainFrame:OnAddMenu()/TODO:AddyourcommandhandlercodehereCStringmenu2;menu0=允许画椭圆;menu1=禁止画椭圆;CWnd*pMainFrame=AfxGetMainWnd();CMenu*pMenuDyna=NULL;CMenu*
24、pMenu=NULL;CMenu*pTopMenu=pMainFrame-GetMenu();intiPos;for(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);
25、for(inti=0;iAppendMenu(MF_STRING,WM_USER+10+i,menui);步骤2添加菜单响应函数voidCMainFrame: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=
26、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);步骤3添加动态菜单响应函数1.在类在类CMainFrameCMainFrame中增加一个变量并初始化中增加一个变量并初始化intint m_ m_SelectMenuSelectMenu;当当m_m_SelectMenuSel
27、ectMenu为为0 0时,第一项为选中状态,允许时,第一项为选中状态,允许画椭圆。否则第二项为选中状态,禁止画椭圆。画椭圆。否则第二项为选中状态,禁止画椭圆。CMainFrame:CMainFrame()/TODO:add member initialization code herem_SelectMenu=0;步骤3添加动态菜单响应函数2.重载主框架类的OnCmdMsg()函数 Project:MenuTestClass Name:CMainFrameObjects IDs:CMainFrameMessages:OnCmdMsg步骤3添加动态菜单响应函数BOOLCMainFrame:On
28、CmdMsg(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消息处理函数 void CMainFrame:OnUpdateDrawCircle(CCmdUI*pCmdUI)/TODO:Add your command update UI handler code he
29、reif(m_nSelectMenu=0)pCmdUI-Enable(true);elsepCmdUI-Enable(false);基本知识1.CWnd 类:GetMenuGetMenu()()函数 2.CMenu类1.GetMenuItemCountGetMenuItemCount()()函数函数2.GetMenuItemIDGetMenuItemID()()函数函数3.DeleteMenuDeleteMenu()()函数函数4.AppendMenuAppendMenu()()函数函数3.OnCmdMsg消息4.4 工具条工具条 学习目标1.自定义工具条2.在工具条中添加控件返回第4章程序的
30、实现步骤1.编辑工具条资源2.创建工具条 3.在工具条上添加控件4.加入控件响应函数 步骤1编辑工具条资源添加工具条添加工具条(IDR_MYTOOLBAR)(IDR_MYTOOLBAR):ID_DRAW_RECTID_DRAW_CIRCLEID_DRAW_LINEID_COMBOBOX工具条含四个工具按扭,其中前两个与菜单“画图”的前两个菜单项的ID号相同,第三个按扭用于画直线,第四个按扭用来显示组合框。步骤步骤22创建工具条创建工具条1.1.在类在类CmainFrameCmainFrame中定义工具条数据成员中定义工具条数据成员:CToolBar CToolBar m_m_wndMyTool
31、BarwndMyToolBar;2.2.在类在类CMainFrameCMainFrame的的OnCreateOnCreate函数中加入以下代码函数中加入以下代码 :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)TRACE0(Failedtocreatetoolbarn);return-1;/fai
32、ltocreate.m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndMyToolBar);步骤步骤22创建工具条创建工具条3.3.添加画线响应函数添加画线响应函数 voidCMenuTestView:OnDrawLine()/TODO:AddyourcommandhandlercodehereCClientDCdc(this);dc.MoveTo(20,20);dc.LineTo(200,200);步骤步骤33在工具条上添加控件在工具条上添加控件 1.
33、1.在类在类CMainFrameCMainFrame中定义数据成员中定义数据成员CComboBox CComboBox m_m_ComboBoxComboBox;2.2.在在CMainFrameCMainFrame的的OnCreateOnCreate函数中加入代码函数中加入代码 CRectrect;m_wndMyToolBar.SetButtonInfo(3,ID_COMBOBOX,TBBS_SEPARATOR,160);m_wndMyToolBar.GetItemRect(3,&rect);rect.bottom+=100;if(!m_ComboBox.Create(CBS_DROPDOWN
34、LIST|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect,&m_wndMyToolBar,ID_COMBOBOX)return-1;m_ComboBox.AddString(FirstItem);m_ComboBox.AddString(SecondItem);m_ComboBox.AddString(ThirdItem);m_ComboBox.SetCurSel(0);步骤4加入组合框响应函数1.1.定位到定位到MainFrmMainFrm.h.h中类的定义处,在其中添加消息响应函中类的定义处,在其中添加消息响应函数的原形:数的原形:afxafx_ _m
35、sgmsg void void OnSelchangeCombo OnSelchangeCombo();();2.定位到定位到MainFrmMainFrm.cppcpp中消息映射宏的定义处,在中消息映射宏的定义处,在其中添加其中添加ComboBoxComboBox控件的控件的ON_CBNSELCHANGEON_CBNSELCHANGE消息的映射宏:消息的映射宏:ON_CBN_SELCHANGE(ID_COMBOBOX,ON_CBN_SELCHANGE(ID_COMBOBOX,OnOnSelchangeComboSelchangeCombo)步骤4加入组合框响应函数3.3.在在MainFrm.c
36、ppMainFrm.cpp中添加消息映射函数体:中添加消息映射函数体:voidCMainFrame:OnSelchangeCombo()CStringmess;intCurSel;CurSel=m_ComboBox.GetCurSel();mess=您选择了第;charNo3;itoa(CurSel,No,10);mess+=No;mess+=项!;MessageBox(mess,消息框,MB_OK|MB_ICONINFORMATION);基本知识1.CToolBar 类:1.1.CreateExCreateEx()()函数函数 2.2.SetButtonInfoSetButtonInfo()
37、()3.3.GetItemRectGetItemRect()()2.CComboBox 类1.Create()Create()函数函数2.AddStringAddString()()函数函数3.SetCurSelSetCurSel ()()函数函数3.手工添加消息响应函数4.5 状态条状态条 学习目标1.在状态信息行显示信息 2.在状态指示器 显示键盘状态返回第4章程序的实现步骤1.在文件在文件MainFrmMainFrm.cppcpp中,找到状态条中,找到状态条indicatorsindicators数组的定义处添加代码数组的定义处添加代码 2.创建创建CtrlCtrl键和键和ShiftSh
38、ift键状态指示器的字符串资源键状态指示器的字符串资源 3.为状态条添加标识号为状态条添加标识号 4.在函数在函数CMainFrameCMainFrame:OnCreateOnCreate()()函数中,函数中,添加状态条的设置代码添加状态条的设置代码 5.显示控制键状态显示控制键状态 6.显示鼠标在视中的位置坐标显示鼠标在视中的位置坐标 步骤1在indicators数组中添加新元素static UINT indicators=ID_SEPARATOR,/status line indicatorID_SEPARATOR,/显示显示x坐标坐标ID_SEPARATOR,/显示显示x坐标坐标ID_
39、INDICATOR_CTRL,/显示显示Ctrl键的状态键的状态ID_INDICATOR_SHIFT,/显示显示Shift键的状态键的状态ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;步骤步骤22创建创建CtrlCtrl键和键和ShiftShift键状态指示器的字符串资键状态指示器的字符串资源源在Workspace窗口中双击ResourceView标签的String Table,打开字符串资源编辑器。选中一个以ID_INDICATOR为开头的字符串资源,按Insert键,插入两个新的字符串资源:ID CaptionID_INDICA
40、TOR_CTRL CtrlID_INDICATOR_SHIFT Shift 步骤3 为状态条添加标识号 通过菜单View下的Resource Symbols菜单项,打开Resource Symbol对话框,单击New按扭,在Name中输入IDC_STATUSBAR,Value取默任值,单击OK按扭。步骤步骤44在函数在函数CMainFrame:OnCreateCMainFrame:OnCreate()函数中,()函数中,添加状态条的设置代码添加状态条的设置代码 if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators(indic
41、ators,sizeof(indicators)/sizeof(UINT)TRACE0(Failedtocreatestatusbarn);return-1;/failtocreatem_wndStatusBar.SetPaneInfo(1,IDC_STATUSBAR,SBPS_POPOUT,50);m_wndStatusBar.SetPaneInfo(2,IDC_STATUSBAR,SBPS_POPOUT,50);步骤步骤55显示控制键状态显示控制键状态 1.在MainFrm.h文件中的类定义内加入消息响应函数的原形,并将成员m_wndStatusBar改成公用类型:public:CStat
42、usBarm_wndStatusBar;afx_msgvoidOnUpdateKeyCtrl(CCmdUI*pCmdUI);afx_msgvoidOnUpdateKeyShift(CCmdUI*pCmdUI);2.在文件MainFrm.cpp消息映射宏的定义处添加两消息映射宏 ON_UPDATE_COMMAND_UI(ID_INDICATOR_CTRL,OnUpdateKeyCtrl)ON_UPDATE_COMMAND_UI(ID_INDICATOR_SHIFT,OnUpdateKeyShift)步骤步骤55显示控制键状态显示控制键状态 3.在文件MainFrm.cpp中添加消息映射函数体 v
43、oidCMainFrame:OnUpdateKeyCtrl(CCmdUI*pCmdUI)pCmdUI-Enable(: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.CStatusBar 类:1.1.SetPaneInfoSetPaneInfo()()函数函数 2.2.SetIndicatorsSetIndicators()()函数函数3.3.SetPaneTextSetPaneText()()函数函数2.GetKeyState(VK_SHIFT)函数返回第4章
限制150内