630 likes | 890 Views
第 7 章 菜单、 工具栏和状态栏. 河北经贸大学信息技术学院. 本章导读. 用户与应用程序的交互通常是从菜单栏中选择命令或用键盘加速器的形式,因此,菜单和加速器资源在 VC++ 编程中是很重要的。 工具栏可以看作是图形化的菜单,是一种更快捷、更有效、更直观的命令输入方式。 状态栏可以随时为用户提供当前程序的状态信息 通过一个实例来介绍菜单、工具栏、状态栏的使用. 7.1 菜单和加速键. 菜单是 Windows 中最常见的界面元素,是一系列命令的列表。 菜单分为两种: 下拉菜单 弹出式菜单(上下文菜单)
E N D
第7章 菜单、工具栏和状态栏 河北经贸大学信息技术学院
本章导读 • 用户与应用程序的交互通常是从菜单栏中选择命令或用键盘加速器的形式,因此,菜单和加速器资源在VC++编程中是很重要的。 • 工具栏可以看作是图形化的菜单,是一种更快捷、更有效、更直观的命令输入方式。 • 状态栏可以随时为用户提供当前程序的状态信息 • 通过一个实例来介绍菜单、工具栏、状态栏的使用
7.1 菜单和加速键 • 菜单是Windows中最常见的界面元素,是一系列命令的列表。 • 菜单分为两种: • 下拉菜单 • 弹出式菜单(上下文菜单) • 加速键是键盘上的一个键或几个键的组合,它通常对应于某一条菜单命令或工具按钮命令,它为用户提供了一种快速执行菜单命令或其他某种功能的方法。
7.1.1 菜单编辑 • 使用菜单编辑器, • 可以增加或删除菜单和菜单项, • 定义菜单标识符ID, • 对菜单进行合理布局, • 设置菜单的初始状态(正常、灰色、加标记等) • 设置菜单提示等。 • 使用AppWizard创建基于SDI的应用程序框架时,会自动创建一个菜单资源:IDR_MAINFRAME • 使用AppWizard创建基于MDI的应用程序框架时,会自动创建两个菜单资源:IDR_MAINFRAME和 IDR_***TYPE(星号表示项目名) • 在菜单编辑器中,可以对AppWizard生成的菜单进行修改,也可以从空白菜单基础上创建需要的菜单
创建下拉菜单的步骤: • 创建菜单资源 • 打开菜单编辑器, • 编辑菜单:在菜单栏中双击空白方框,弹出[ Menu Item Properties]对话框,设置菜单项属性(表7-1) • 为菜单资源选择一个类(视图类或对话框类) • 建立菜单命令消息处理函数 • WM_COMMAND:选择菜单项或使用快捷键时将产生此消息 • UPDATE_COMMAND_UI:更新命令用户接口消息,当菜单在显示之前,会先通过此消息进行更新,从而得到更新后的菜单。
实例7-1:使用菜单命令绘图 • 本程序中可以通过菜单命令在窗口中绘制出不同的椭圆和矩形,程序的运行效果:
步骤: 1、创建一个基于SDI的应用程序,项目名为:EX7_1 2、在项目工作区的[Resource View]中,双击菜单资源[IDR_MAINFRAME],打开菜单资源编辑器。 3、在[帮助]菜单前插入一个新菜单[绘图(&D)],并为其添加相应的菜单项,如图所示 Alt+D 激活该菜单
菜单属性设置 Caption ID 提示(Prompt) 椭圆 Pop-up 矩形 Pop-up 清除(&C) ID_DRAW_CLEAR 清除窗口中的图形 100*100 ID_DRAW_ELLIPSE1 绘制一个外接矩形为100*100的椭圆 100*200 ID_DRAW_ELLIPSE2 绘制一个外接矩形为100*200的椭圆 100*100 ID_DRAW_RECT1 绘制一个100*100的矩形 100*200 ID_DRAW_RECT2 绘制一个100*200的矩形
4、为菜单资源选择一个类CEX7_1View 5、使用[MFC ClassWizard],为视图类CEX7_1View添加菜单消息处理函数. Object Ids 消息 消息处理函数 ID_DRAW_CLEAR COMMAND OnDrawClear() ID_DRAW_ELLIPSE1 COMMAND OnDrawEllipse1() ID_DRAW_ELLIPSE2 COMMAND OnDrawEllipse2() ID_DRAW_RECT1 COMMAND OnDrawRect1() ID_DRAW_RECT2 COMMAND OnDrawRect2()
6、为消息处理函数添加代码 绘制一个外接矩形为100*100的椭圆 void CEX7_1View::OnDrawEllipse1() { // TODO: Add your command handler code here CDC *pDC=GetDC(); // 获取窗口设备环境 CRect r, rect; // 定义矩形类对象 GetClientRect(&r); // 获取客户区窗口坐标范围 rect.bottom=r.bottom/2+50; // 设置rect的范围 rect.top=r.bottom/2-50; rect.right=r.right/2+50; rect.left=r.right/2-50; pDC->Ellipse(rect); // 在rect指定的范围内画椭圆 } 50 r.bottom 50
绘制一个100*100的矩形 void CEX7_1View::OnDrawRect1() { // TODO: Add your command handler code here CDC *pDC=GetDC(); // 获取窗口设备 CRect r, rect; // 定义矩形类对象 GetClientRect(&r); // 获取客户区窗口坐标范围 rect.bottom=r.bottom/2+50; // 设置rect的范围 rect.top=r.bottom/2-50; rect.right=r.right/2+50; rect.left=r.right/2-50; pDC->Rectangle(rect); // 在rect指定的范围内画矩形 }
清除菜单项的消息处理函数: void CEX7_1View::OnDrawClear() { // TODO: Add your command handler code here Invalidate(); // 刷新窗口 } 该函数用来使当前视图失效,强制程序重新执行OnDraw()函数以刷新窗口
技术要点: • CRect类:是MFC封装矩形区域操作的一个专用类,其结构与Windows中的RECT结构类似。 • 类型RECT的定义: typedef struct _RECT{ LONG left; LONG top; LONG right; LONG bottom; } RECT; • 成员函数(略) 左上角坐标 右下角坐标
绘制椭圆函数: CDC类的成员函数 BOOL Ellipse (int x1, int y1, int x2, int y2); BOOL Ellipse ( LPCRECT lpRect ); • 绘制矩形函数:CDC类的成员函数 BOOL Rectangle(int x1, int y1, int x2, int y2); BOOL Rectangle( LPCRECT lpRect ); • 参数: x1,y1:表示矩形左上角的坐标 x2,y2:表示矩形右下角的坐标, lpRect:是一个RECT结构或CRect类对象
7.1.2 CMenu类 • 如果想在程序中使用上下文菜单,或者在程序运行中对菜单项进行动态修改,就必须使用MFC的菜单类CMenu • 使用CMenu类可以完成大量复杂的菜单操作:创建、追踪、更新、销毁菜单
CMenu类成员函数 表 7-1 CMenu 的初始化方法 方法 说明 Attach() 把一个标准的 Windows 菜单句柄附加到 CMenu 对象上 CreateMenu() 创建一个空菜单并把它附加到 CMenu 对象上 CreatePopupMenu() 创建一个弹出式菜单并把它附加到 CMenu 对象上 DeleteTempMap() 删除由 FromHandle() 构造函数创建的任何临时 CMenu 对象 DestroyMenu() 去掉附加到 CMenu 对象上的菜单并释放该菜单占有的任何内存 Deatch() 从 CMenu 对象上拆开 Windows 菜单句柄并返回该句柄 FromHandle() 当给定 Windows 菜单句柄时,返回 CMenu 对象指针 m_hMenu: 指定附加给CMenu类对象的窗口菜单的句柄 GetSafeHmenu() 返回由 CMenu 对象封装的菜单句柄成员 ( m_hMenu) LoadMenu() 从可执行文件装入菜单资源并把它附到 Cmenu 对象上 LoadMenuIndirect() 从内存中的菜单模板中装入菜单并把它附到 CMenu 对象上 函数原型在系统目录的AFXWIN.H文件中
DeleteMenu() TrackPopupMenu() 删除某个特定的菜单项(包括附属的级连菜单项) 在一个POINT结构所指定的位置显示一个快捷菜单 菜单项操作函数 方法 说明 AppendMenu() 把一个新项加到给定的菜单的末端 在弹出式菜单中,把一个校验标记放到一个菜单项 CheckMenuItem() 或从一个菜单项中取消一个校验标记 在此组中,把一个单选按钮放到菜单项旁边或从全部 CheckMenuRadioItem() 其它菜单项里取消一个已存在的单选按钮 EnableMenuItem() 去掉 ( 添加 ) 一个菜单项 GetMenuContextHelpId() 检索与菜单结合的帮助上下文 ID GetMenuItemCount() 在弹出式或顶层菜单中获得项数 GetMenuItemID() 获取指定位置的菜单项的标识 GetMenuState() 获得指定菜单项的状态或弹出式菜单中的菜单项数 GetMenuString() 获得指定菜单项的标签 GetSubMenu() 获得指向弹出式菜单的指针 InsertMenu() 在指定位置插入新的菜单项,把其它项向下移 ModifyMenu() 在指定位置改变已存在的菜单项 RemoveMenu() 从指定菜单删除与弹出式菜单结合的菜单项 SetMenuContextHelpID() 设置与菜单有关的帮助上下文 ID SetMenuItemBitmaps() 与菜单项有关的指定校验标记位图 菜单操作方法中只有两个方法用来处理菜单的顶层操作
7.1.3 上下文菜单 • 创建一个具体的上下文菜单,通常有两种方法: • 先创建一个菜单资源,再在程序中将编辑好的资源加载进来 • 利用CMenu类的强大功能,在程序中动态地创建上下文菜单
示例 为实例7-1添加上下文菜单 • 打开项目EX7_1 • 为应用程序添加一个新菜单 • 在项目工作区的[Resource View]中,在[Menu]上右击鼠标,从弹出菜单中选择[Insert Menu]命令添加一个新菜单,设置标识ID为IDR_CONTEXTMENU • 在菜单资源编辑器中制作上下文菜单,使用与绘图菜单相同的ID标识,以便调用相同的消息处理函数
为视图类添加成员变量和消息处理函数 为菜单资源连接一个类CEx7_1View,然后为视图类添加成员变量 Object Ids 消息 消息处理函数 ID_DRAW_CLEAR COMMAND OnDrawClear() ID_DRAW_ELLIPSE1 COMMAND OnDrawEllipse1() ID_DRAW_ELLIPSE2 COMMAND OnDrawEllipse2() ID_DRAW_RECT1 COMMAND OnDrawRect1() ID_DRAW_RECT2 COMMAND OnDrawRect2() CEX7_1View WM_RBUTTONDOWN OnRButtonDown CEX7_1View WM_CONTEXMENU OnContextMenu() 变量 类型 说明 m_bFlag bool 标记是否使用了上下文菜单 m_ConPoint CPoint 记录鼠标右击时相对于窗口的位置 同“绘图”菜单
当用户在视图中右击鼠标时,系统将产生两条消息:当用户在视图中右击鼠标时,系统将产生两条消息: WM_RBUTTONDOWN WM_CONTEXMENU (上下文菜单消息): 对此消息进行处理而得到上下文菜单 afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); 右键单击鼠标时的位置,相对于屏幕左上角的位置 右键单击窗口的句柄 右键单击鼠标时的位置,相对于当前窗口左上角的位置
添加程序代码 在视图类构造函数中对成员变量设置初始值 CEX7_1View::CEX7_1View() { // TODO: add construction code here m_bFlag=false; // 上下文菜单未在使用中 } 由于主菜单命令和上下文菜单命令具有相同的ID标识,所以成员变量m_bFlag来标识当前命令是来自主菜单还是上下文菜单。 m_bFlag=true; 表示使用上下文菜单 m_bFlag=false; 表示未使用上下文菜单
鼠标右键按下消息: void CEX7_1View::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_ConPoint=point; // 获取鼠标单击时相对于窗口位置的坐标 CView::OnRButtonDown(nFlags, point); }
绘制100*100的内接椭圆: void CEX7_1View::OnDrawEllipse1() { // TODO: Add your command handler code here CDC *pDC=GetDC(); // 获取窗口设备 CRect r, rect; // 定义矩形类对象 if (m_bFlag) { rect.bottom=m_ConPoint.y+50; // 设置rect的范围 rect.top=m_ConPoint.y-50; rect.right=m_ConPoint.x+50; rect.left=m_ConPoint.x-50; m_bFlag=false; } else { GetClientRect(&r); // 获取客户区窗口坐标范围 rect.bottom=r.bottom/2+50; // 设置rect的范围 rect.top=r.bottom/2-50; rect.right=r.right/2+50; rect.left=r.right/2-50; } pDC->Ellipse(rect); // 在rect指定的范围内画椭圆 }
WM_CONTEXTMENU消息处理函数 void CEX7_1View::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu Drawmenu; // 创建菜单实例 Drawmenu.LoadMenu(IDR_CONTEXTMENU); // 加载菜单资源 m_bFlag=true; // 设置标记,使用上下文菜单 // 将Drawmenu菜单对象中的第一个子菜单载入为弹出菜单 CMenu *pContextmenu=Drawmenu.GetSubMenu(0); // 显示上下文菜单 pContextmenu->TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); Drawmenu.DestroyMenu(); // 销毁菜单 } 成员函数参考教材,不再赘述.
在程序中动态创建上下文菜单 void CEX7_1View::OnContextMenu(CWnd* pWnd, CPoint point) { // TODO: Add your message handler code here CMenu Drawmenu; // 创建菜单实例 m_bFlag=true; // 设置标记,使用上下文菜单 Drawmenu.CreatePopupMenu(); // 创建空弹出菜单 // 添加菜单项 Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_ELLIPSE1,"椭圆 100*100"); Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_ELLIPSE2,"椭圆 100*200"); Drawmenu.AppendMenu(MF_SEPARATOR); Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_RECT1,"矩形 100*100"); Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_RECT2,"矩形 100*200"); Drawmenu.AppendMenu(MF_SEPARATOR); Drawmenu.AppendMenu(MF_ENABLED,ID_DRAW_CLEAR,"清 除"); // 显示弹出菜单 Drawmenu.TrackPopupMenu( TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); Drawmenu.DestroyMenu(); // 销毁菜单 }
使用键盘快捷键 P210-211 • Accelerator资源项,双击IDR_MAINFRAME出现加速键资源列表 • 建立新的加速键,双击加速键列表的最下端的空行,出现“Accel Properties”对话框,如图7-9 • 设置组合键
为对话框添加菜单P218 (1)添加并定制菜单资源 (2)菜单与对话框关联:在对话框属性页的Menu下拉列表框中选择菜单ID (3)为菜单选择对话框类,之后消息映射,编写消息处理函数代码。
7.2 工具栏CToolBar 工具栏可以看作是图形化的菜单,是一种更快捷、更有效、更直观的命令输入方式。 当创建SDI/MDI应用程序时,AppWizard不仅创建了缺省菜单,并且创建了缺省的工具栏IDR_MAINFRAME,其相应的位图Toolbar.bmp。 用户可以为缺省工具栏中添加一些按钮,也可以设计和使用自己的工具栏。 • 自己创建工具栏的一般步骤: • 构造CToolBar类对象; • 调用Create()(或CreateEx())函数创建工具栏并将它与CToolBar类对象连接; • 调用LoadToolBar()函数装入工具栏资源
7.2.1 CToolBar类 CStatusBar(状态条) CToolBar类有几个兄弟类 COleResizeBar(OLE控制条) 都是用来接收某些 命令输入并向用户 显示状态消息的类 CDialogBar(对话条)
工具条函数简介 (1 )Create()函数 BOOL Create ( CWnd* pParentWnd, //pParentWnd为指向工具条所在父窗口的指针 DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP, // dwStyle为工具条的风格(见下页) UINT nID = AFX_IDW_TOOLBAR //nID表示工具条子窗口的ID号 ); 下述代码生成一工具条,工具条风格为“初始可见”,且放置在窗口“顶部”,工具条窗口的ID号的16进制值为9100: CToolBar m_ToolBar=new CToolBar( ); m_ToolBar.Create(this, WS_VISIBLE |CBRS_TOP,0x9100);
(2) LoadToolBar()函数 BOOL LoadToolBar(LPCTSTR lpszResourceName); //字符串形式定义的资源 BOOL LoadToolBar(UINT nIDResource); //整型形式定义的资源 (3 )SetBarStyle()函数 m_wndToolBar.SetBarStyle(CBRS_TOOLTIPS|CBRS_FLYBY| CBRS_SIZE_DYNAMIC); WS_VISIBLE 使工具条窗口初始可见 CBRS_BOTTOM 初始时将工具条放到窗口底部 CBRS_FLYBY 在状态栏显示命令描述 CBRS_NOALIGN 防止控制条在其父窗口改变大小时被复位 CBRS_TOOLTIPS 鼠标光标在按钮上暂停时,显示工具提示 CBRS_TOP 初始时将工具条放在窗口顶部 CBRS_SIZE_DYNAMIC 工具条的尺寸是可变的
对于CFrame不可用 (4 )工具条的移动 为使用户能够移动工具条,为此,需向工具条及框架窗口发送消息。这可通过调用CToolBar::EnableDocking和CFrame::EnableDocking实现。 二函数原型均如下: void EnableDocking( DWORD dwStyle ); 默认状况下,CToolBar工具条只能被应用程序所移动 实现工具条移动的常用代码: m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); 用户也可以对工具条进行移动或定位。或者在程序控制下,通过调用CFrameWnd::DockControlBar来移动以及调用 CFrameWnd::FloatControlBar来定位一工具条。 停靠 风格
(5)工具条的显隐控制 由于工具条是一个窗口,它的显示或隐藏可以通过其父类CWnd的成员函数来实现 显示或隐藏一个工具条 void CWnd:: ShowControlBar( CControlBar*pBar, BOOL bShow, BOOL bDelay ); 为TRUE,显示;为FALSE,隐藏 在改变工具条状态前要通过函数CWnd::GetStyle获取当时工具条的状态 DWORD GetStyle( ) const; 为TRUE,延迟显示工具条;为FALSE,立即显示
7.2.2 工具条类编程实例 创建一应用程序程序名为MyToolBar,其标题为“MyToolbar”,在应用程序中有一个工具条,上面有四个按钮,分别为“N”、“O”、“S”和“sh” 在窗口中单击“显示(S)”执行菜单,则显示一个信息窗口,窗口信息为“这是关于工具条的样例程序”,同样,若在窗口中单击工具条上相应的“sh”按钮,也会有同样的效果;若单击“查看”菜单,也会弹出一个下拉菜单;单击“工具条(T)”项,使工具条隐藏或出现。
为IDR_TOOLBAR设置属性 应用程序的可视化编程部分 1. 对话框中的工具条的设计 选择Insert菜单中的Resource。这时,显示Insert Resource 窗口。选择其中的Toolbar项,单击New按钮。这样在资源文件MyToolbar.rc中增加了一项资源,即一个工具条。
2.工具条按钮的编辑 (1) 加入工具条按钮 可以利用VC所提供的绘图工具,直接进行按钮的编缉,这主要用来编缉自己的按钮,对于已经存在的图标,如果要把它作为下一个按钮,可以先加入一个ICON资源,再通过拷贝和粘贴来放到Toolbar上。 (2)删除工具条按钮 删除按钮要把该按钮拖出工具条以外。 (3)移动工具条按钮 是用鼠标将要移动的按钮拖动到工具条上需要的位置。 (4)插入空格 P221 前插空格/后插空格/删除空格 (5)工具栏按纽属性设置 P221图
3.按钮与菜单的结合-----使用同一个ID 按钮 ID Prompt N ID_FILE_NEW 建立新文档\n新建 O ID_FILE_OPEN 打开一个现有文档\n打开 S ID_FILE_SAVE_AS 将活动文档以一个新文件名保存\n另存为 sh ID_SHOW 显示一个对话框\n显示
4. 应用程序的代码编程 • 给菜单“显示(S)”选项编写代码 • 在菜单“显示”上单击鼠标右键, • 在弹出的快捷菜单中选择ClassWizard命令。 • (2) 在Object IDs列表框中选择ID_SHOW项。 • (3) 在Messages列表框中选择COMMAND 项,这里与命令按钮不同,不是BN_CLICKED。 • (4) 单击Add Functtion按钮,在弹出的窗口中接受建议函数名OnShow()。 • (5) 这样在ClassWizard窗口的Member functions列表框中增加了成员函数OnShow(),单击ClassWizard窗口的Edit Code按钮。 • (6) 在函数OnShow ()中输入以下代码: • void CMainFrame::OnShow() • { AfxMessageBox(”这是关于工具条的样例程序”);} //显示一个对话框
2.添加工具条代码 有三个地方需要添加工具条代码 • (1)首先为类CMainFrame 加入一个成员变量m_wndToolBar,它有两种方法。 • 一种方法是,在Workspace 窗口的ClassView选项卡中,找到CmainFrame类的标识,点击鼠标的右键,选择Add Member Variable…子菜单,在Variable Type 编辑框中填入CToolBar,在Variable Name编辑框中填入m_wndToolBar, 在Access中选择protected一项。 • 另一种方法是在文件中直接添加所需的代码。 • 在头文件 MainFrm.h中,加入以下代码: • class CMainFrame : public CFrameWnd • { • …………… • protected: // control bar embedded members • CToolBar m_wndToolBar;//加入一个成员变量m_wndToolBar • …………… • } • 这段代码为类CMainFrame加入一个受保护的成员变量m_wndToolBar
(2)加入代码以实现使工具条可见的功能 • 下一块代码出现在MAINFRAME.CPP文件中。这块代码设置工具条的特性,使你在启动程序时能看见它。在CMainFrame的OnCreate函数中加入以下代码: • // MainFrm.cpp : implementation of the CMainFrame class • int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) • { • …………… • if (!m_wndToolBar.Create(this) || //创建工具条 • !m_wndToolBar.LoadToolBar(IDR_TOOLBAR)) //引入资源IDR_TOOLBAR • { • TRACE0("Failed to create toolbar\n"); • return -1; // fail to create • } • …………… • } • 若现在运行程序,则可以看见工具条了。
(3)更改属性 • 为了使工具条成为可“浮动”工具条(这样可以在应用程序中把它从一个地方移到另一个地方),要考虑进行一些其它的编码。 • 仍在MAINFRAME.CPP文件中,在CmainFrame的OnCreate函数中在刚才加入的代码后面加入以下代码: • // MainFrm.cpp : implementation of the CMainFrame class • int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) • { • …………… • m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | • CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); • //设定工具条的风格为:当鼠标光标在按钮上暂停时,显示工具提示和命令描述,并设定工具条的大小是可变的。 • m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); • EnableDocking(CBRS_ALIGN_ANY); • DockControlBar(&m_wndToolBar); • //实现工具条的移动 • …………… • } • 若希望有两个工具条,只要像刚才那样定义工具条资源并为类CMainFrame加入第二个成员变量m_wndToolBar2,然后添加合适的响应程序代码即可。
【例】创建一个包含有“粗体”、“斜体”和“下划线”三个工具条按钮的应用程序,同时在界面的下拉菜单中也具有上述三个菜单选项,它们均能够对显示文本的属性进行改变。【例】创建一个包含有“粗体”、“斜体”和“下划线”三个工具条按钮的应用程序,同时在界面的下拉菜单中也具有上述三个菜单选项,它们均能够对显示文本的属性进行改变。 (1)在MFC AppWizard-Step 1 -->选择Single Document -->在MFC AppWizard Step 4of 6 -->取消Docking toolbar、Initial status bar、printing and print preview选项。其余接受默认选择。 (2)在Workspace窗口 --> Resource View选项卡,打开Menu文件夹,双击菜单ID值IDR_MAINFRAME,在右边的窗口中出现了菜单编辑器 -->删除所有的系统菜单,创建如下表所示的菜单及菜单项。 对象 ID Caption 菜单 字体样式(&F) 菜单项 ID_VIEW_BOLD 粗体(&B) 菜单项 ID_VIEW_ITALIC 斜体(&I) 菜单项 ID_VIEW_UNDERLINE 下划线(&U)
(3)单击主菜单Insert中的Resource菜单项 --> 在弹出的Insert Resource对话框的Resource type列表框中选择Toolbar -->单击New按钮。这样就可以给应用程序增加了一个工具条。依此方法创建“B”、“I”、“U”。 在“B”按钮上双击鼠标左键,弹出属性对话框。
Workspace窗口 -->选Resource View选项卡 -->打开Toolbar文件夹 -->在工具条ID上单击鼠标右键选择Properties菜单项 -->设置工具条的属性。
Workspace --> ClassView选项卡 -->在CMainFrame上单击鼠标右键选择Add Member Variable菜单项 -->加入工具条变量CToolBar m_wndToolBar 打开文件CMainFrame.cpp,在函数OnCreate()的return TRUE;语句前加入代码如下: …. if (!m_wndToolBar.Create(this) || //创建工具条 !m_wndToolBar.LoadToolBar(IDR_TOOLBAR)) //引入资源IDR_TOOLBAR { TRACE0("Failed to create toolbar\n"); return -1; //创建失败 } //设定工具条的风格为:当鼠标光标在按钮上暂停时,显示工具提示和命令描述,并设定工具条的大小是可变的。 m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); //移动工具条 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); …
调用工具条类成员函数Create在CMainFrame类中创建工具条调用工具条类成员函数Create在CMainFrame类中创建工具条 • 调用函数LoadToolBar将刚才创建的工具条资源和m_wndToolBar连接起来 • 调用函数SetBarStyle设置工具条的样式 • 为了能让工具条在窗口中移动,还需要调用工具条类成员函数 • EnableDocking和CMainFrame类成员函数EnableDocking 为视图类增加的变量 变量类型 变量名 说明 BOOL m_bBold =1, 标志当前选择的字体为粗体 BOOL m_bItalic=1, 标志当前选择的字体为斜体 BOOL m_bUnderline=1, 标志当前选择的字体为下划线体 消息处理函数 Object IDs Message 消息处理函数 ID_VIEW_BOLD COMMAND OnViewBold() ID_VIEW_ITALIC COMMAND OnViewItalic() ID_VIEW_UNDERLINE COMMAND OnViewUnderline()
void CMy15_4View::OnViewBold() { m_bBold = TRUE; m_bItalic = FALSE; m_bUnderline = FALSE; InvalidateRect(NULL,TRUE); //刷新窗口 } 调用函数InvalidateRect刷新用户区,系统发送WM_PAINT消息,并调用相应的视图类成员函数OnDraw。OnDraw是系统自动生成的函数 void CMy15_4View::OnViewItalic() { m_bBold = FALSE; m_bItalic = TRUE; m_bUnderline = FALSE; InvalidateRect(NULL,TRUE); //刷新窗口 } void CMy15_4View::OnViewUnderline() { m_bBold = FALSE; m_bItalic = FALSE; m_bUnderline = TRUE; InvalidateRect(NULL,TRUE); //刷新窗口 }