📄 09.4.2 创建工具栏.txt
字号:
当我们单击 Style程序的【查看飞工具栏】菜单命令,将会发现程序原来由 MFC帮助我们产生的那
个工具栏从窗口中消失了。当再次单击相同的菜单命令后,该工具栏又显示出来了。下面我们也要
对刚才自己新建的工具栏实现同样的隐藏和显示功能。首先为 Style程序再添加一个菜单项,通过
单击该菜单项来隐藏或显示刚才新建的那个工具栏。并且同样要为该菜单项设置一个复选标记,当
这个新工具栏出现时,该菜单项带有这个复选标记:当这个新工具栏消失时,该菜单项没有这个复选
标记。
本例是在 Style程序的【查看】子菜单卡再添加一个菜单项,将其 B属性设置为 IDM_VIEW_
NEWTOOLBAR, Caption属性设置为"新的工具栏"。接着为 CMainFrame类添加对这个菜单项的命令响
应函数,并在此函数中,实现先前新建的那个工具栏的显示和隐藏。前面己经提过,工具栏本身也
是一个窗口,可以调用 CWnd类的 ShowWindow函数让其显示或隐藏。具体实现代码如例 9-14所示。
191J 9-14
vo工 d CMainFrame : :OnViewNewtoolbar()
// TODO: Add your command handler code here
if(m_newToolBar.IsWindowV工 s ible() )
{
m_newToolBar . ShowW工 ndow (SW_HIDE) ;
else m_newToolBar . ShowWindow(SW_SHOW) ;
上述如例 9-14所示代码中,首先判断这个新工具栏的当前状态,是显示的还是隐藏的。如果是显示
的,就让它隐藏起来;如果当前是隐藏的,就让它显示出来。
Build井运行 Style程序,程序界面如图 9.23所示。当单击【查看\新的工具栏】菜单命令后,可以
发现窗口右边的那个新工具栏上的按钮消失了,但是这个工具栏仍存在,如图 9.24所示。
为什么会出现这种情况呢?这是因为当窗口上的工具栏被隐藏或显示后,停靠在窗口上的其他控制条
对象的位置可能会有所变动,这时需要调用框架类的RecalcLayout成员函数来重新调整它们的位置,
这个函数的原型声明如下所示:
virtual vo工d RecalcLayout( BOOL bNotify = TRUE };
该函数有一个BOOL类型的参数: bNotify,如果该参数为真,则框架窗口上活动的对象会收到布局变
动的通知:如果为假,则不会收到。默认值是TRUE。因此,在上述例如14所示的CMainFrame类的
OnViewNewtoolbar函数的最后再添加RecalcLayout函数的调用,结果如例如15所示。
vooid CMainFrame: :OnViewNewtoolbar(}
{ // TODO : Add your command handler code here if(m_newToolBar . IsWindowVisible(}} {
m_ newToolBar . ShowWindow(SW_H IDE} ;
else
.
m_newTo o lBar . ShowWindow (SW_ SHOW) ;
}
RecalcLayout(} ;
Build并运行Style程序,程序界面如图9.23所示。当单击【查看\新的工具栏】菜单命令后,会发现
窗口右边的那个新建工具栏消失了:再次单击【查看\新的工具拦】菜单命令后,这个工具栏又显示
出来了。可见,程序实现了我们所需要的功能。
如果把我们自定义的这个工具栏拖动到窗口中间的某个位置,也就是让它处于一种浮动的状态,结
果如图 9.25所示。然后再次单击【查看\新的工具栏】菜单命令,会发现此时程序又出现问题了:
这时这个工具栏上的按钮消失了,但工具栏仍存在。
图 9.25浮动的工具栏
实际上,当工具栏再次显示或隐藏后,需要再次调用框架类的DockCon位olBar函数,让工具栏停靠
在主框架窗口上。因此为了解决上述问题,需要在 CMainFrame类的 OnViewNewtoolbar函数的最后
再调用一次框架类的DockControlBar函数,结果如例 9-16所示。
例9-16
void CMainFrame : :OnViewNewtoolbar() { 1/ TODO : Add your command handler c ode here
if(ffi_newToolBar { ffi_newToolBar . 工sW工ndowVisible()) . Showwindow(SW_H工DE) ;
else {
ffi_newToolBar . ShowWindow(SW_SHOW) ; } RecalcLayout() ; DockControlBar(&rn_newToolBar);
再次Build并运行Style程序,并将自定义的工具栏拖动到窗口中间的某个位置,让它处于一种浮动
的状态。然后单击【查看\新的工具栏】菜单命令,这时,会发现这个工具栏从窗口中消失了。当再
次单击【查看飞新的工具栏】菜单命令后,会发现这个工具栏停靠在客户区的顶部了,如图9.26所
示。
如果我们把Style程序中 AppWizard自动创建的那个工具栏拖动到窗口中间的某个位置,让其处于一
种浮动状态,然后单击【查看飞工具栏】菜单命令,该工具栏将消失:当再次单击【查看\工具栏】
菜单命令后,会发现这个工具栏在先前浮动位置处又显示出来了。那么如何让我们新建的工具栏也
在原先显示的位置处显示出来呢?这就需要用到下面将介绍的ShowCon位offiar函数。
ShowControffiar是CFrameWnd类的成员函数,该函数的作用是隐藏或思示指定的控制条。该函数的
原型声明如下所示:
void ShoWControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
. pBar
CControlBar类型的指针,指向将要显示或隐藏的控制条。前面已经介绍过: CTooffiar 类派生于
CControlBar类。
. bShow
布尔类型,其值如果为TR阻,表示显示指定的控制条:如果为FALSE,表示隐藏指定的控制条。
. bDelay
如果为TRUE,延迟显示控制条:如果为FALSE,立即显示控制条。
下面我们在 Style程序中利用 ShowControlBar函数来显示或隐藏工具栏。首先将 CMainFrame类的
OnViewNewtoolbar函数中己有代码注释起来或删除,然后添加如例9-17中加灰显示的那行代码。
~tl9-17
void CMainFrame : :OnViewNewtoolbar() / / TODO : Add your command handler code here
ShowControlBar(&m一newToolBar, !m_newToolBar.IsW工ndowVisible() , FALSE);
.
上述新添代码通过调用工具栏对象的 IsWindowVisible成员函数,获得工具栏当前的状态,如果该
函数的返回值是TRUE,则说明工具栏当前是显示状态,那么这时应该隐藏该工具栏,也就是说,这
时 ShowControlBar函数的第二参数应该为 FALSE;如果该函数的返回值是F丛SE,则说明工具栏当前
是隐藏状态,那么这时应该显示该工具栏,也就是说,这时ShowControffiar函数的第二个参数应该
为TRUE。因此,应该对IsWindowVisible 函数的返回值进行逻辑非操作之后作为ShowCon位olBar函
数的第二个参数的值。
Build井运行Style程序,将会发现这时的程序能够实现和刚才介绍的显示/隐藏工具栏的方法同样的
效果。通过上述两种实现方法,可以看到,使用 ShowCon位offiar函数比较简单,一个函数就能搞
定。
下面,我们还要为刚才添加的名称为"新的工具栏"的菜单项设置复选标记,因此,需要为这个菜单
项添加一个 UPDATE_COMMAND_UI消息响应函数,这可以通过 ClassWizard来完成,如图9.27所示,
在 Classname下拉框中选择CMainFrame类, Object
338 I势'
vc忡深λ
IDs列表中选择 IDM_VIEW_ NEWTOOLBAR , Mess ages列表中选择 UPDATE
COMMAND_UI,然后单击【 Add Function. . .】按钮,并且接受 ClassWizard自动产生的响
应函数名称 : OnUpdateViewNewtoolbar,单击【 Edit Code】按钮定位到该函数的定义处。
陆 自 幽俨抽血
耐--
恤 『『
I I
I I IM..叫Actt四Xt.4Member Variables Automation Events Class In'oe aps 一如Obj.ct!O.:
JlMeSS8ICS: 一W OnTest ON 10M TEST:COMMANO R:OnVi.wNewtoolb.r ON 10M VIEW NEWTOOLBACOMMANO
叨f g/for and button .nabllngraylng0..四Iptlon:C时Ib.dc menu
froj.ct: 3 Add Cja阔. I 阿「 '3 JCMainframe CI.55 name: umdh
H-。 :~ . .\S刷叫Malnfrm.h. O:\'..\StyI.\Malnfrm.cpp kmnc m awuum nw mn
-m mmm
旦旦~
Member functions Iw OnCr..te
ON WM CREATE
W OnTim.r ON WM TIMER
V PreCreateWindow
工j三1 …-
] Can..1
I
.
图 9 .27为"新的工具栏"菜单项添加 UPDATE_COMMAND _UI消息响应
在 OnU pdate ViewNewtoolbar函数内部添加下面这行代码。
pCmdUI->SetCheck(m_newToolBar .工 sWindowVisible()) ;
这里,也是利用工具栏对象的 IsWindowVi s ibl e函数的返回值来设置是否显示复选标
记。如果该函数返回 TRUE,说明当前工具栏是显示状态,因此应该设置复选标记 ;如果该函数返回
FALSE,说明当前工具栏是隐藏状态,因此不应该显示复选标记。 Build井运行 Style程序,可以看
到程序初始显示时自定义的工具栏处于显示状态,打开【查看】子菜单,可以看到【新的工具栏】
按钮前面有了一个复选标记,程序界面如图
9.28所示。
4皿三i
,新的工具在一' . .
.
γ一 11 .d
图 9.28显示新建的工具栏,同时相应菜单项带有复选标记
当我们单击【查看\新的工具栏】按钮后,自定义的工具栏从窗口上消失了。这时,再次打开【查看】
子菜单,可以看到【新的工具栏】按钮前的复选标记也消失了。程序界面如图 9.29所示。
, 1339
第9
p k标题川』 F. A国J2!l 立件也·毗) 1..ω帽恻 ID 1:;在国l品 '工且栏①
-----'--..状意往(s)
晰的工具栏
, r→厂 M
图 9.29新建的工具栏消失,菜单项复选标记也消失
我们可以看到,通过为菜单项添加UPDATE_COMMAND_UI消息的响应,可以非常方便地为该菜单项设置
或取消复选标记。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -