1、2018/7/19,1,面向对象与可视化程序设计 -Visual C+ 编程主讲教师:唐 龙教授 (计算机科学与技术系)黄维通博士 (计算机与信息管理中心)清 华 大 学2001年2月,2018/7/19,2,第十五章工具条类及其应用,2018/7/19,3,内容提要,工具条类简介工具条类控件的应用,2018/7/19,4,15.1.工具条类简介,1. 工具条,工具条是图形化的菜单,可更快捷、更有效的命令输入方式。工具条作为程序的一个资源存放在资源脚本中,在程序运行时才调用。工具条的标识符在resource.h文件中定义,并与系统菜单、系统图标的ID相同,这样,可以使工具条资源建立后直接链接到
2、主窗口。,2018/7/19,6,2. 工具条资源模板,工具条资源模板在工具条资源文件中定义工具条各个按钮和整个工具条的位图,其格式如下:ID TOOLBAR 工具条属性 像素宽,像素高BEGIN BUTOON ID1 . BUTOON IDnENDIDID TOOLBAR 工具条属性 bmp文件名,2018/7/19,7,2. 工具条资源模板(续),例如,在名为mytoolbar.rc工具条资源文件中定义的文件操作工具条资源模板如下:IDR_ TOOLBAR TOOLBAR DISCARDABLE 16,15BEGIN BUTOON ID_FILE_NEW/新建 BUTOON ID_FILE
3、_OPEN /打开 BUTOON ID_FILE_SAVE_AS/另存 SEPERATOR/分隔块 BUTOON ID_SHOW/显示ENDIDR_ TOOLBAR TOOLBAR DISCARDABLE “restoolbar.bmp”,3.CToolBar类,工具条类CToolBar由控制条类CControlBar派生的,而控制条类CControlBar由CWnd类直接派生的。CToolBar类有几个兄弟类,都是用来接收某些命令输入并向用户显示状态消息的类,包括:CStatusBar(状态条)COleResizeBar(OLE控制条)CDialogBar(对话条)在AfxWin.h中定义了
4、CToolBar类。,4. CToolBar类的方法,CToolBar类的方法,包括:构造方法;工具条按钮操作方法;虚拟方法。,2018/7/19,10,(1) Create()函数,创建并初始化工具条对象BOOL Create( CWnd* pParentWnd, /指向父窗口的指针 DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP, /风格 UINT nID = AFX_IDW_TOOLBAR /工具条的ID号);例如:CToolBar m_ToolBar=new CToolBar( ); m_ToolBar.Create(this,WS_VISIBLE
5、|CBRS_TOP,0x9100);,风格为“初始可见”,且置于窗口“顶部”,工具条窗口的ID号,2018/7/19,11,(2) LoadToolBar()函数,加载字符串形式定义的资源BOOL LoadToolBar(LPCTSTR lpszResourceName); 加载整型形式定义的资源BOOL LoadToolBar(UINT nIDResource);,(3) LoadBitmap()函数,加载字符串形式定义的位图资源BOOL LoadToolBar(LPCTSTR lpszResourceName); 加载整型形式定义的位图资源BOOL LoadToolBar(UINT nID
6、Resource);,2018/7/19,12,(4) SetBarStyle()函数,重设置工具条风格,例如m_wndToolBar.SetBarStyle (CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC);,工具条窗口的风格WS_VISIBLE 使工具条窗口初始可见CBRS_BOTTOM 初始时将工具条放到窗口底部CBRS_FLYBY 鼠标光标在按钮上暂停时,显示命令描述CBRS_NOALIGN 防止控制条在其父窗口改变大小时被复位CBRS_TOOLTIPS 鼠标光标在按钮上暂停时,显示工具提示CBRS_TOP 初始时将工具条放在窗口底部CBRS_S
7、IZE_DYNAMIC 工具条的大小可变,光标在按钮上暂停时,显示工具提示,光标在按钮上暂停时,显示命令描述,工具条的大小可变,2018/7/19,13,(5) 工具条的移动,缺省状况下,CToolBar工具条只能被应用程序所移动。用户移动工具条,需向工具条及框架窗口发送消息。这可通过调用如下函数实现:CToolBar:EnableDocking或CFrameWnd:EnableDocking。这二函数原型均为:void EnableDocking( DWORD dwStyle );,对于CFrameWnd不可用,停靠风格,2018/7/19,14,(6)工具条的显隐控制,调用CWnd:Get
8、Style获取当时工具条状态,即: DWORD GetStyle( ) const;若WS_VISIBLE风格的工具条不能用SetStyle( )改变由于工具条是一个窗口,其显示或隐藏可通过其父类CWnd的成员函数ShowWindow( )来实现。,2018/7/19,15,15.2.工具条类的应用,例15-1带工具条类的应用程序,其界面标题为MyToolBar,有四个下拉菜单和 “文件”工具条。“文件”工具条有四个按钮 “N”,“O”,“S”和“sh”。工具条 “N”,“O”,“S”按钮与 “文件(F)”下拉菜单中几项功能相同;工具条“sh”按钮与菜单“显示(S)”功能相同,显示一个“这是关
9、于工具条的样例程序”信息窗口;工具条隐现由“查看”的下拉菜单中“工具条(T)”项控制。,2018/7/19,17,带工具条类的应用程序MyToolBar 的其界面,2018/7/19,18,应用程序的可视化编程部分,为IDR_TOOLBAR设置属性,1.对话框中的工具条的设计,选Insert菜单中的Resource。这时,显示Insert Resource窗口。选Toolbar项,单击New按钮。这样在资源文件MyToolbar.rc中增加了一项资源,即一个工具条。,2018/7/19,19,2工具条按钮的编辑,加入工具条按钮可以利用VC所提供的绘图工具,直接编缉自己的按钮。若已经存在的图标,
10、作为下一个按钮,应先加入一个 ICON资源,再经拷贝和粘贴,放到Toolbar上。删除工具条按钮删除按钮只要把该按钮拖出工具条以外。分隔工具条按钮用鼠标将要移动的按钮拖动到工具条上需要的位置。,2018/7/19,20,按钮IDPromptNID_FILE_NEW建立新文档n新建OID_FILE_OPEN打开一个现有文档n打开SID_FILE_SAVE_AS以一个新文件名保存n另存为shID_SHOW显示一个对话框n显示,3菜单的编辑,2018/7/19,21,应用程序的代码编程,1. 给菜单“显示(S)”选项编写代码,(1) 在菜单“显示”上单击右键,在弹出菜单中选ClassWizard命令
11、。(2) 在Object IDs列表框中选择ID_SHOW项。(3) 在Messages列表框中选择COMMAND 项是BN_CLICKED。(4) 单击Add Functtion按钮,接受弹出的窗口中函数名OnShow()。(5) 这样在ClassWizard窗口的Member functions列表框中增加了成员函数OnShow(),单击Edit Code按钮。Visual C+显示源代码文件(.cpp),并将光标停在函数OnShow()处,等待用户定义函数的内容。(6) 在函数OnShow ()中输入以下代码:void CMainFrame:OnShow() AfxMessageBox(
12、”这是关于工具条的样例程序”);/显示对话框,2018/7/19,22,2 添加工具条代码有三个地方需要添加工具条代码,(1)为类CMainFrame 加入一个成员变量m_wndToolBar,有两种方法。用Class Wizard进行,在Workspace 窗口的ClassView选项卡中,找到CmainFrame类的标识,点击鼠标的右键,选择Add Member Variable子菜单,在Variable Type 编辑框中填入CToolBar,在Variable Name编辑框中填入m_wndToolBar, 在Access中选择protected一项。在头文件 MainFrm.h中直接
13、添加所需的代码,如下这段代码为类CMainFrame加入一个受保护的成员变量m_wndToolBar :class CMainFrame : public CFrameWnd protected: / control bar embedded members CToolBar m_wndToolBar;/加入成员变量m_wndToolBar,2018/7/19,23,(2)在MAINFRAME.CPP文件中加入代码,设置工具条的特性以实现使工具条可见的功能。在CMainFrame的OnCreate函数中加入以下代码/ MainFrm.cpp : implementation of the CM
14、ainFrame classint CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (!m_wndToolBar.Create(this) | /创建工具条 !m_wndToolBar.LoadToolBar(IDR_TOOLBAR)/引入IDR_TOOLBAR TRACE0(Failed to create toolbarn);return -1; /若失败,则给出提示,并返回-1 若现在运行程序,则可以看见工具条了。,2018/7/19,24,(3)更改属性为了使工具条成为可“浮动”工具条,要考虑进行一些其它的编码。仍在MAINF
15、RAME.CPP文件中,在CmainFrame的OnCreate函数中在刚才加入的代码后面加入以下代码/ MainFrm.cpp : implementation of the CMainFrame classint CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);/设定工具条的风格为:当鼠标光标在按钮上暂停时,显示工具提示和命令描述,并/设
16、定工具条的大小是可变的。m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(/实现工具条的移动注意:若希望有两个工具条,只要象刚才那样定义工具条资源并为类CMainFrame加入第二个成员变量m_wndToolBar2,然后添加合适的响应程序代码即可。,2018/7/19,25,(第十五章)完,2018/7/19,26,第15-16章课后练习题,编写一个具有下拉菜单和工具条单(或多)文档应用程序,菜单包括:“文件”,“绘图”等,工具条含有“直线”,“圆”,“矩形”等绘图按钮。注6月4日前完成,