《工具栏、状态栏m.ppt》由会员分享,可在线阅读,更多相关《工具栏、状态栏m.ppt(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、工具栏、状态栏和组合栏参考书MFC Windows 程序设计第12 章1.1 创建和初始化工具栏因为工具栏是应用程序的主框架窗口的子窗口,通常随框架窗口的创立而创立,所以一般在框架窗口类中添加一个CToolBar 成员,并在框架窗口的OnCreate 函数中调用CToolBar:Create。如:m_wndToolBar.Create(this,WS_CHILD WS_VISIBLE CBRS_BOTTOM);或m_wndToolBar.Create(this);m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()&CBRS_TOP)CBRS_
2、BOTTOM);1.2 为工具栏添加文字在资源中双击工具栏的图标,修改图标大小为40,19在创建工具栏的代码下加入如下代码m_wndToolBar.SetButtonText(0,_T(New);m_wndToolBar.SetButtonText(1,_T(Open);m_wndToolBar.SetButtonText(2,_T(Save);m_wndToolBar.SetButtonText(4,_T(Cut);m_wndToolBar.SetButtonText(5,_T(Copy);m_wndToolBar.SetButtonText(6,_T(Paste);m_wndToolBar
3、.SetButtonText(8,_T(Print);m_wndToolBar.SetButtonText(10,_T(Help);m_wndToolBar.SetSizes(CSize(48,42),CSize(40,19);/第一个size 是BUTTON 的大小,第二个size 是图标的大小。在添加文本后再调用SetSizes()1.3 修改工具栏的样式CToolBar:SetButtonStyle创建复选按纽,使之一直处于下陷的状态直到再一次单击之。m_wndToolBar.SetButtonStyle(1,TBBS_CHECKBOX);注:当程序处理了ON_UPDATE_COMMAN
4、D_UI 消息,并调用CCmdUI:SetCheck,则标准按纽会转换为复选按纽。1.3 修改工具栏的样式CToolBar:SetButtonStyle创建单选按纽,它们一直处于下陷状态,直到该组中的其它单按纽被按下。m_wndToolBar.SetButtonStyle(5,TBBS_CHECKGROUP);m_wndToolBar.SetButtonStyle(5,TBBS_CHECKGROUP);m_wndToolBar.SetButtonStyle(5,TBBS_CHECKGROUP);此时5、6、7为一组单选按纽,它们之中只有一个被选中。1.3 修改工具栏的样式CToolBar:Ge
5、tState(),CToolBar:SetState()给工具栏添加单选按纽时,应在每组中选中一个成员作为默认按纽,如下代码所示。int nState=m_wndToolBar.GetToolBarCtrl().GetState(ID_BUTTON_A);/得到按纽的状态,是否可用,是否被按下,是否被选中等等m_wndToolBar.GetToolBarCtrl().SetState(ID_BUTTON_A,nState|TBSTATE_CHECKED);/如果该按纽没有被选中,则设置为选中状态。1.4 固定式和浮动式工具栏 CControlBar:EnableDocking(.)m_wndT
6、oolBar.EnableDocking(CBRS_ALIGN_ANY)EnableDocking(CBRS_ALING_ANY)DockControlBar(&m_wndToolBar):停靠在默认位置,顶部 DockControlBar(&m_wndToolBar,AFX_IDW_DOCKBAR_RIGHT):右端位标志 说明CBRS_ALIGN_LEFT允许停放在框架窗口的左侧CBRS_ALIGN_RIGHT允许停放在框架窗口的右侧CBRS_ALIGN_TOP允许停放在框架窗口的顶部CBRS_ALIGN_BOTTOM允许停放在框架窗口的底部CBRS_ALIGN_ANY允许停放在框架窗口的
7、任意位置固定式和浮动式工具栏(续)FloatControlBar(&m_wndToolBar,CPoint(x,y);FloatControlBar 可以有第三个参数,如果参数为CBRS_ALIGN_TOP,则工具栏为水平放置。如果为CBRS_ALIGN_LEFT,则垂直放置。如果以0调用EnableDocking,然后再调用FloatControlBar,则能得到一个浮动的工具栏,但它无法停放到框架窗口的一侧。CControlBar:IsFloating,判断是否为浮动状态。SetWindowText 为浮动工具栏添加标题。通过设置样式:CBRS_SIZE_DYNAMIC 标志,可以使用户调
8、整浮动工具栏的大小。而标志CBRS_SIZE_FIXED,则保证工具栏的大小与形状不变。如果创建多行包含多行按钮的静态工具栏,则实用样式TBBS_WRAPPED 告诉CToolBar 换行符的位置,见下页示例代码1.5 代码示例:m_wndToolBar.SetWindowText(MYTOOLBAR);/m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_SIZE_DYNAMIC);m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()|CBRS_SIZE_FIXED);m_wndT
9、oolBar.SetButtonStyle(2,m_wndToolBar.GetButtonStyle(0)|TBBS_WRAPPED);m_wndToolBar.SetButtonStyle(5,m_wndToolBar.GetButtonStyle(0)|TBBS_WRAPPED);1.6 控制工具栏的可见性菜单项的ID 为:ID_VIEW_TOOLBAR、ID_VIEW_STATUS_BAR。原因为在CFrameWnd的消息映射表中已有该消息映射。void ShowControlBar(CControlBar*pBar,BOOL bShow,BOOL bDelay);(pBar-GetS
10、tyle()&WS_VISIBLE)!=0 判断pBar是不是处于显示状态。设置bar 的style 是否为WS_VISIBLE 是无法实现显示和隐藏工具栏的。1.7 保持工具栏按钮和应用程序同步CCmdUI:SetCheck()CCmdUI:Enable()1.8 添加工具提示和状态栏工具说明在资源的属性中,添加Prompt 内容,格式为 string1nstring2其中string1 为在状态栏中显示的内容string2 为鼠标划过工具栏的该按纽时显示的提示内容工具栏的样式中必须包含CBRS_FLYBY1.9 在工具栏中添加非按纽控件1、在工具栏中添加一个按纽,并设置其ID。2、在CMa
11、inFrame 中添加非按纽控件的对象定义,如CComboBoxm_ComboShape;(假设此处添加一个ComboBox)3、在创建工具栏函数的后面,创建该控件:CRect rect;m_wndToolBar.GetItemRect(12,&rect);rect.right=rect.left+80;rect.bottom+=200;m_wndToolBar.SetButtonInfo(12,ID_SHAPE,TBBS_SEPARATOR,80);if(!m_ComboShape.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|CBS_DROPDOWN
12、LIST|CBS_HASSTRINGS,rect,&m_wndToolBar,ID_SHAPE)return FALSE;m_ComboShape.AddString(直线);m_ComboShape.AddString(三角形);m_ComboShape.AddString(矩形);m_ComboShape.AddString(圆形);m_ComboShape.SetCurSel(0);对于函数SetButtonInfo,参数1为按纽的索引项,参数2 为按纽的ID,参数3为按纽的样式,如果为TBBS_SEPARATOR,则参数4为设置该按纽的宽度。1.9 在工具栏中添加非按纽控件4、手工添加
13、该控件的响应函数.hafx_msg void OnSelchangeShape();.cppON_CBN_SELCHANGE(ID_SHAPE,OnSelchangeShape)void CMainFrame:OnSelchangeShape()CShapesView*pview=(CShapesView*)GetActiveView();pview-DrawShape(m_ComboShape.GetCurSel();1.10 使工具栏设置永久化在OnCreate()函数中调用LoadBarState(“.”)调用LoadBarState 将保存的设置信息读出,并将每个工具栏及状态栏恢复到以
14、前的状态。在OnClose()函数中调用SaveBarState(“.”)SaveBarState 将每个工具栏的停放或浮动状态、位置、方向和或见性写到注册表或私有INI 文件中。如果应用程序包括状态栏,SaveBarState 也会记录有关状态栏的信息。注意,如果添加了自已的工具栏,如果想要正确的保存与恢复配置信息,则创建自已的工具栏时,应该将工具栏的ID 传给创建函数,而不是默认的创建形式。如m_ToolBarColor.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|,CRect(0,0,0,0),IDR_TOOLBAR_COLOR);而不是m_ToolBarCo
15、lor.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|);2.1 状态栏状态栏可以显示与上下文有关的工具栏按钮和菜单项的帮助信息。在Windows 中已经变的非常普遍。MFC 提供了方便的方法来开发状态栏,当CStatusBar 被连接到框架窗口时,如果有菜单项被加亮显示,CStatusBar 则自动显示帮助文本。如果工具栏的样式包含CBRS_FLYBY 标志,则状态栏也显示工具栏按钮的帮助文本。2.2 创建和初始化状态栏CStatusBar m_wndStatusBar;static UINT indicators=ID_SEPARATOR,/status line
16、 indicatorID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;m_wndStatusBar.Create(this);m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT);2.3 创建一个简单的“二进制”窗格添加一个字符串变量,如ID_DEMO在String Tab 中添加其对应的字符串,如“DEMO”,该字符串即为要在状态栏中显示的字符串。修改indicators,在后面加上一项ID_DEMO,在CMainFrame 中添加一个响应函数:
17、afx_msg void onUpdateDemo(CCmdUI*pCmdUI);在CMainFrame 的消息映射表中添加 ON_UPDATE_COMMAND_UI(ID_DEMO,onUpdateDemo)添加响应函数:void CMainFrame:onUpdateDemo(CCmdUI*pCmdUI)pCmdUI-Enable(m_bShow);/可以在外面修改m_bShow 来决定DEMO是否显示2.4 默认的窗格常量 ID_INDICATOR_CAPSID_INDICATOR_NUMID_INDICATOR_SCRL.在CFrameWnd 类中已经定义了其更新函数:(见winfrm
18、.cpp)ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS,OnUpdateKeyIndicator)ON_UPDATE_COMMAND_UI(ID_INDICATOR_NUM,OnUpdateKeyIndicator)ON_UPDATE_COMMAND_UI(ID_INDICATOR_SCRL,OnUpdateKeyIndicator)2.5 为菜单项提供上下文相关帮助如果第一个窗格(左端的)赋予ID 值ID_SPARATOR,这就等于启动了MFC 一个特殊功能,当用户加亮显示其菜单项时,主框架会查看是否包含ID 值等于菜单项ID的字符串资源,如果匹配,则加载字符
19、串资源并把它显示在状态栏窗格中。因此,通过提供ID 为菜单项ID 的字符串资源,就可以给应用程序菜单提供与上下文有关的帮助。如果菜单项与工具栏的ID 相同,则字符串资源既可以作为菜单项的帮助文本,也可以作为工具栏的掠过式文本。2.6 创建自定义状态栏窗格 CStatusBar:SetPaneInfo()。可以实用该函数随意调整窗格大小。SetPaneInfo的4 个参数按顺序为:窗格的索引、窗格的ID、样式和宽度。样式见下表:样式 说明SBPS_NOBORDERS不具备3-D 边界SBPS_POPOUT具备凸起的边界SBPS_NORMAL不扩展面板宽度,具备凸起或内陷的边界SBPS_DISABLED窗格中不显示文本SBPS_STRETCH 将状态栏剩余空间并入该窗格,每个状态栏只能有一个窗格具备此样式SBPS_OWNERDRAW 创建者的窗格2.6 创建自定义状态栏窗格(续)自定义窗格后,要告诉状态窗格要显示什么。有两种方法:调用CStatusBar:SetPaneText,直接设置文本。给窗格映射一个更新函数,并由些函数调用CCmdUI:SetText 设定文本。2.6 创建自定义状态栏窗格(续)代码示例。见代码statusbar.cpp