单文档应用程序设计2_第1页
单文档应用程序设计2_第2页
单文档应用程序设计2_第3页
单文档应用程序设计2_第4页
单文档应用程序设计2_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键

更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应程序负责将这一按键解释成一个命令

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键

更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应从用户角度来讲,菜单与加速键并没有什麽差别

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键

更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应从用户角度来讲,菜单与加速键并没有什麽差别

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键

更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应Windows为二者生成相同的消息决定的

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键

更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应从程序设计的角度看二者却是分别定义的---菜单是用菜单资源定义的,而加速键是用加速键资源定义的

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应工具条是第三种命令输入机制

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应带有按钮的窗口

输入命令的响应的最重要的手段——菜单

更快捷,更有效的命令输入方式——加速键更快捷,更有效的命令输入方式——工具栏10.4菜单、加速键和用户命令响应带有按钮的窗口10.4.1菜单

MFC中类层次CObjectCMenuMFC中的CMenu类封装了HMENU,用于管理应用程序的菜单10.4.1菜单菜单的种类在Windows应用程序中,常用的菜单有以下几种:下拉菜单上下文菜单(右键弹出菜单)图符菜单动态菜单10.4.2下拉菜单要在主窗口中加入自己的菜单,一般分三步进行:编辑菜单资源,设置菜单属性(包括菜单Caption和ID)

使用ClassWizard,以自动映射菜单消息和成员函数手工编辑成员函数,加入菜单消息处理代码10.4.2下拉菜单编辑菜单资源选择ResourceView标签,切换到资源视图选择菜单资源类型选定菜单资源IDR_MAINFRAME

打开菜单资源编辑器编辑当前菜单10.4.2下拉菜单编辑菜单资源用ClassWizard映射菜单命令消息10.4.2下拉菜单用ClassWizard映射菜单命令消息10.4.2下拉菜单用ClassWizard映射菜单命令消息10.4.2下拉菜单voidCMenuView::OnDrawCircle(){

//TODO:Addyourcommandhandlercodehere //创建一客户区设备对象 CClientDCClientDC(this);

//在屏幕内画圆 ClientDC.Arc(80,40,160,120,80,80,80,80);}加入对应消息处理代码10.4.2下拉菜单voidCMenuView::OnDrawLine(){

//TODO:Addyourcommandhandlercodehere //在程序主窗口客户区中作一起点为(120,120), //终点为(260,260)的直线 //创建一客户区设备对象 CClientDCClientDC(this);

//移动对象起点至(120,120) ClientDC.MoveTo(120,120);

//自(120,120)至(260,260)画直线 ClientDC.LineTo(260,260);}加入对应消息处理代码10.4.2下拉菜单voidCMenuView::OnDrawRectangle(){

//TODO:Addyourcommandhandlercodehere //基本解释同上,使用设备对象画矩形 CClientDCClientDC(this); ClientDC.MoveTo(120,120); ClientDC.LineTo(170,120); ClientDC.LineTo(170,150); ClientDC.LineTo(120,150); ClientDC.LineTo(120,120);}加入对应消息处理代码10.4.2下拉菜单voidCMenuView::OnDrawRectangle(){

//TODO:Addyourcommandhandlercodehere //基本解释同上,使用设备对象画矩形 CClientDCClientDC(this); ClientDC.MoveTo(120,120); ClientDC.LineTo(170,120); ClientDC.LineTo(170,150); ClientDC.LineTo(120,150); ClientDC.LineTo(120,120);}加入对应消息处理代码10.4.3上下文菜单10.4.3上下文菜单单击鼠标右击时激活的菜单,称为上下文菜单加入上下文菜单,一般分三步进行:编辑菜单资源,设置菜单属性(包括菜单Caption和ID)

使用ClassWizard,映射鼠标右键消息在鼠标右键消息映射函数中利用Cmenu类创建上下文菜单新建一个ID为IDR_CONTEXTMENU菜单资源,并按下图设计:注意:各菜单项的ID号与前面定义的ID号相同,这样就可以将其映射到下拉对应的命令消息处理函数上。10.4.3上下文菜单创建菜单资源10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)参数nFlags指明屏幕位置与鼠标位置风格10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)屏幕位置风格:

TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN鼠标位置风格:

TPM_LEFTBUTTON,TPM_RIGHTBUTTON10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)x,y为一依赖于前面所指定风格的上下文菜单的屏幕位置坐标10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)参数pWnd指定快捷菜单的所属窗口,该窗口接受快捷菜单的消息10.4.3上下文菜单创建上下文菜单调用CMenu类的成员函数TrackPopupMenu实现上下文菜单BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL)参数pWnd指定快捷菜单的所属窗口,该窗口接受快捷菜单的消息voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCMenuContextMenu;if(!ContextMenu.LoadMenu(IDR_CONTEXTMENU)) AfxThrowResourceException();CMenu*pPopupMenu=ContextMenu.GetSubMenu(0);ASSERT(pPopupMenu!=NULL);ClientToScreen(&point);pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x,point.y,this);CView::OnRButtonDown(nFlags,point);}实例代码10.4.3上下文菜单voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCMenuContextMenu;if(!ContextMenu.LoadMenu(IDR_CONTEXTMENU)) AfxThrowResourceException();

CMenu*pPopupMenu=ContextMenu.GetSubMenu(0);ASSERT(pPopupMenu!=NULL);ClientToScreen(&point);pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x,point.y,this);CView::OnRButtonDown(nFlags,point);}实例代码10.4.3上下文菜单voidCMenuView::OnRButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCMenuContextMenu;if(!ContextMenu.LoadMenu(IDR_CONTEXTMENU)) AfxThrowResourceException();CMenu*pPopupMenu=ContextMenu.GetSubMenu(0);ASSERT(pPopupMenu!=NULL);ClientToScreen(&point);

pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x,point.y,this);CView::OnRButtonDown(nFlags,point);}实例代码10.4.3上下文菜单Project→AddtoProject→ComponentandControlsVisualC++Components目录Pop-up

Menu选择需要菜单的类编辑、修改默认的菜单并用ClassWizard生成必要的消息映射函数,对菜单项进行处理即可另一上下文菜单实现技术10.4.3上下文菜单ComponentGallery10.4.4图符菜单创建图符菜单,一般分三步进行:创建位图资源

载入位图资源用Cmenu类实现图符菜单10.4.4图符菜单用位图编辑器创建位图资源:创建位图资源IDB_CIRCLEIDB_LINEIDB_RECTANGLE10.4.4图符菜单在CMainFrame类中定义CBitmap类对象:载入位图资源 //位图资源对象

CBitmapm_hLine;

CBitmapm_hCircle;

CBitmapm_hRectangle;10.4.4图符菜单在CMainFrame类的OnCreate函数中载入位图资源:载入位图资源intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ //...

hLine.LoadBitmap(IDB_LINE); hCircle.LoadBitmap(IDB_CIRCLE); hRectangle.LoadBitmap(IDB_RECTANGLE); //...}10.4.4图符菜单添加下拉菜单,实现菜单类型控制用CMenu类实现图符菜单ID_MENU_TEXTID_MENU_BITMAP10.4.4图符菜单响应菜单项,实现图符菜单用CMenu类实现图符菜单voidCMainFrame::OnMenuText(){ //TODO:Addyourcommandhandlercodehere m_bText=TRUE; CMenu*pMenu=GetMenu(); CMenu*pSubMenu=pMenu->GetSubMenu(3); pSubMenu->ModifyMenu(ID_DRAW_LINE, MF_BYCOMMAND,ID_DRAW_LINE,"直线(&L)"); pSubMenu->ModifyMenu(ID_DRAW_CIRCLE,MF_BYCOMMAND,ID_DRAW_CIRCLE,"圆(&C)"); pSubMenu->ModifyMenu(ID_DRAW_RECTANGLE, MF_BYCOMMAND,ID_DRAW_RECTANGLE,"矩形(&R)");}10.4.4图符菜单响应菜单项,实现图符菜单用CMenu类实现图符菜单voidCMainFrame::OnMenuBitmap(){ //TODO:Addyourcommandhandlercodehere m_bBitmap=TRUE; //以位图对象指针作ModifyMenu()函数的参数,将菜单换为了图符菜单 CMenu*pMenu=GetMenu(); CMenu*pSubMenu=pMenu->GetSubMenu(3);

pSubMenu->ModifyMenu(ID_DRAW_LINE, MF_BYCOMMAND,ID_DRAW_LINE,&m_hLine); pSubMenu->ModifyMenu(ID_DRAW_CIRCLE,MF_BYCOMMAND,ID_DRAW_CIRCLE,&m_hCircle); pSubMenu->ModifyMenu(ID_DRAW_RECTANGLE, MF_BYCOMMAND,ID_DRAW_RECTANGLE,&m_hRectangle);}10.4.4图符菜单常用CMenu类中的菜单控制函数函数含义AppendMenu在菜单尾部添加一个菜单项InsertMenu在菜单给定位置插入一个菜单项ModifyMenu改变菜单项的命令ID、正文或其他特征DeleteMenu删除菜单项和相关的子菜单RemoveMenu删除菜单项在工程中再添加一个英文菜单资源,只要注意一点是将中英文对应的菜单项的ID设为同样的值。10.4.5中英文双语菜单添加英文菜单资源用资源编辑器编辑菜单资源直接编辑资源文件重建一个同样的工程资源改名后复制到当前工程中添加英文菜单资源有三种方法:在菜单资源中添加菜单以实现两种语言的菜单的切换,将其ID设为ID_MENU_LANGUAGE。10.4.5中英文双语菜单添加英文菜单资源10.4.5中英文双语菜单加载英文菜单资源在CMainFrame中添加如下成员:public: //菜单语言标志 BOOLm_bMenuCh;

//菜单资源对象

CMenum_hMenuCh; CMenum_hMenuEn;10.4.5中英文双语菜单加载英文菜单资源在CMainFrame的构造函数中对m_bMenuCh初始化:CMainFrame::CMainFrame(){ //TODO:addmemberinitializationcodehere

m_bMenuCh=TRUE; ……}10.4.5中英文双语菜单加载英文菜单资源在CMainFrame的OnCreate中载入相应菜单资源:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ …… //载入菜单资源

m_hMenuCh.LoadMenu(IDR_MAINFRAME_CH); m_hMenuEn.LoadMenu(IDR_MAINFRAME_EN); ……}10.4.5中英文双语菜单实现双语菜单的切换在ID_MENU_LANGUAGE的消息响应函数中实现切换:voidCMainFrame::OnMenuLanguage(){ //TODO:Addyourcommandhandlercodehere //实现中文菜单的切换 if(!m_bMenuCh) { m_bMenuCh=TRUE;

SetMenu(&m_hMenuCh); } //实现英文菜单的切换 else { m_bMenuCh=FALSE;

SetMenu(&m_hMenuEn); }}10.4.6系统菜单概念10.4.6系统菜单获取系统菜单通过调用CWnd类的成员函数GetSystemMenu()获取CMenu*GetSystemMenu(BOOLbRevert)const;10.4.6系统菜单获取系统菜单通过调用CWnd类的成员函数GetSystemMenu()获取CMenu*GetSystemMenu(BOOLbRevert)const;bRevert=TRUE时,恢复原系统菜单设置10.4.6系统菜单获取系统菜单通过调用CWnd类的成员函数GetSystemMenu()获取CMenu*GetSystemMenu(BOOLbRevert)const;bRevert=FALSE时,实现对系统菜单的操作10.4.4图符菜单创建图符菜单,一般分三步进行:创建位图资源

载入位图资源用Cmenu类实现图符菜单10.4.6系统菜单标准系统菜单的ID

SC_RESTORESC_MOVESC_SIZESC_MINIMIZESC_MAXIMIZESC_CLOSE添如下所示“系统菜单”,以完成对系统菜单的控制ID_SYS_MODIFYID_SYS_RESET10.4.6系统菜单实例代码在相应消息响应函数中添加如下代码:voidCMainFrame::OnSysModify(){ //TODO:Addyourcommandhandlercodehere //以FALSE调用系统菜单,以便对其进行修改

CMenu*pSystemMenu=GetSystemMenu(FALSE); //改变系统菜单中“移动”菜单项,以实现在程序窗口中画一矩形

pSystemMenu->ModifyMenu(1,MF_BYPOSITION,ID_FILE_NEW,"画矩形");}10.4.6系统菜单实例代码在相应消息响应函数中添加如下代码:voidCMainFrame::OnSysReset(){ //TODO:Addyourcommandhandlercodehere //以TRUE为参数调用系统菜单,实现了系统菜单的复原

CMenu*pSystemMenu=GetSystemMenu(TRUE);

}10.4.6系统菜单实例代码处理WM_SYSCOMMAND消息并检测菜单nID参数voidCMainFrame::OnSysCommand(UINTnID,LPARAMlParam){ //改变系统缺省菜单的行为 if((nID&0xFFF0)==ID_FILE_NEW) //在消息WM_SYSCOMMAND中,参数nID的低四位为 //Windows系统内部使用,在应用程序使用其值时, //应与0Xfff0求与后使用方能得到正确结果。 {

CMainFrame::OnFileNew(); } //在应用程序没有涉及的消息映射,应调用系统标准调用处理 else { CFrameWnd::OnSysCommand(nID,lParam); }}10.4.6系统菜单实例代码对ID_FILE_NEW文件打开命令生成消息响应函数OnFileNewvoidCMainFrame::OnFileNew(){ //TODO:Addyourcommandhandlercodehere //系统菜单中的一个消息响应函数 MessageBox("哈哈,系统菜单也让我改了!");}10.4.6系统菜单实例代码ClassWizard列出的消息只是最常用的,对于没有列出的可以手工添加,下面以WM_SYSCOMMAND为例说明:1、先在CMainFrame的类定义中声明消息处理函数:

afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);10.4.6系统菜单实例代码2、在消息映射处添加ON_WM_SYSCOMMAND(): BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame)

ON_WM_SYSCOMMAND()

...... //}}AFX_MSG_MAP END_MESSAGE_MAP()10.4.6系统菜单实例代码3、然后编写OnSysCommand函数: voidCMainFrame::OnSysCommand(UINTnID,LPARAMlParam) { ...... }10.4.6系统菜单实例代码菜单和加速键总是密切地联系在一起的,这两种资源类型联手协作,让用户能更容易地完成任务,以提高用户操作的速度。10.4.6加速键菜单是分层命令结构的物理表示加速键则提供了该结构的快捷访问方式两种方式可以产生相同的消息,实现相同的操作例如“文件|新建”命令的加速键CTRL-N实现快速访问10.4.6加速键加速键资源VIRTKEY代表加速键的键盘扫描码不能以ASCII字符显示10.4.6加速键加速键显示在菜单资源的Caption(标题)域中指明加速键用C语言或Windows格式化字符命令实现10.4.6加速键加速键显示如将菜单的Caption域修改成:英文菜单(&L)\tCtrl-L菜单项名称10.4.6加速键加速键显示如将菜单的Caption域修改成:英文菜单(&L)\tCtrl-L给字母L加下划线10.4.6加速键加速键显示如将菜单的Caption域修改成:英文菜单(&L)\tCtrl-LTab符号10.4.6加速键加速键显示如将菜单的Caption域修改成:英文菜单(&L)\tCtrl-L加速键名称10.4.7命令提示信息状态栏提示信息加速键显示10.4.7命令提示信息工具栏提示信息加速键显示10.4.7命令提示信息提示信息虽然不是必要的,但应该提供该信息加速键显示更新命令用户接口消息10.4.8控制菜单项状态更新命令用户接口消息UPDATE_COMMAND_UI10.4.8控制菜单项状态菜单更新机制

ON_UPDATE_COMMAND_UI消息下拉之前集体更新所有的菜单项显示菜单10.4.8控制菜单项状态菜单更新机制框架发送菜单项的更新命令消息在UPDATE_COMMAND_UI映射函数中完成更新若无UPDATE_COMMAND_UI映射函数,则检查该命令IDCOMMAND消息映射函数是否存在,若有则启用菜单项否则禁用该菜单项10.4.8控制菜单项状态菜单更新机制按钮的命令更新机制与菜单的命令接口更新机制类似,只是工具条按钮的命令接口更新在空闲循环时完成。这种更新机制仅适用于弹出式菜单,对于顶层菜单

温馨提示

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

评论

0/150

提交评论