📄 09.4.2 创建工具栏.txt
字号:
9.4.2 创建工具栏
让我们先看一下框架窗口创建工具栏的过程。在 Style程序中,可以看到在 CMainFrame类的头文件
中
定义了一个 CToolBar类型的成员变量: m
wndToolBar0 CToolBar就是工具栏类,它的继承层次结构如图9.19所示。图9.19 CToolBar类的继承
层次结构
可以看到, CToolBar类派生于CControlBar类,而后者又派生于CWnd类,因此工具栏也是一个窗口。
1.创建工具栏的方法
,
VC++为我们提供了两种创建工具栏的方法。
(1)第一种方法
需要遵循以下几个步骤:
创建工具栏资源:
[1)构造CToolBar对象:
调用Create或CreateEx函数创建Windows工具栏,并把它与己创建的CToolBar
对象关联起来:因调用LoadToolBar函数加载工具栏资源。其中, CToolBar类的Create成员函数的原
型声明如下所示:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CH工LD I WS_VISIBLE CBRS_TOP , UINT nID
= AFX_IDW_TOOLBAR };
该函数各个参数的意义如下所述:
. pParentWnd
CWnd类型的指针,指定工具栏对象的父窗口。
. dwStyle
指定工具栏的样式,例如工具栏是一个子窗口 CWS_CHILD)、 工具栏是可视的 CWS_VISffiLE )、工
具栏停靠在框架窗口的顶部 C CBRS_TOP)。
. nID
.
指定工具栏子窗口的ID.
CToolBar类的 CreateEx成员函数的原型声明如下所示 :
BOOL CreateEx(CWnd* pParentWnd, DWORD dwC trlStyle = TBSTYLE_FLAT , DWORD dwStyle = WS_CH
ILD WS_VISIBLE | CBRS_ALIGN_TOP , CRect rcBorders = CRect(O , 0 , 0, 0) , UINT n工 D
= AFX_IDW_TOOLBAR);
该函数各个参数的意义如下所述:
. pParentWnd
CWnd类型的指针,指定工具栏对象的父窗口。
. dwCtrlStyle
设置内嵌在工具栏上的 CToo lBarCtrl对象创建时的扩展风格,该参数默认值为: TBSTYLE FLAT。
. dwStyle
与 Create函数同名参数相同,用来指定工具栏的样式。
. rcBorders
定义工具栏窗口边框的宽度。
. nID
与 Create函数同名参数相同,用来指定工具栏子窗口的 ID。
( 2)第二种方法
需要遵循以下几个步骤:
E构造 CToo lB ar对象:
rn调用 Create或 CreateEx函数创建 Windows工具栏,并把它与己创建的 CToolBar对象关联起来:
rn调用 LoadBitmap函数加载包含工具栏按钮图像的位图:我们先前在 Style程序中看到的工具栏资
源 : IDR一MAINFRAME,在保存时是以一幅
位图的形式保存的,该位图文件名称为 Toolbar.bmp,位置是在当前工程所在目录下的 res目录下。
这幅位图上有许多小的图像,它们分别对应于工具栏上的各个按钮。!]J调用 SetButtons函数设置
按钮样式,并把工具栏上的一个按钮与位图中的一个图像相关联。
2. MFC创建工具栏的过程
在 Style程序中, MFC AppWizard自动产生的与工具栏对象相关的代码存在于 CMainFrame类的
OnCreate函数中,如例 9-12所示。
int CMainFrame: :OnCreate(LPCREATESTRUCT lpCreateStruct)
{
…... if (!m_wndToolBar.CreateEx(this , TBSTYLE_FLAT , WS_CHILD I WS_VISIBLE CBRS_TOP
CBRS_GR工 PPER I CBRS_TOOLTIPS CBRS_FLYBY I CBRS_S工 ZE_DYNAM士 C) I I
!m_wndToolBar.LoadToolBar(IDR_MA工 NFRAME) )
11
TRACEü("Failed to create toolbar\n ) ;
return -1; // fail to create
…...
// TODO: Delete these three lines if you don't want the toolbar to
/ / be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
…...
从如例如 12所示代码可以看到,在 CMainFrame类的 OnCreate函数中,首先调用 CreateEx函数创
建程序的工具栏对象,接着调用 LοadToolB ar函数加载工具栏资源: IDR MAINFRAME。
飞合·细 iR I:i MFC为我们自动创建的工具栏和主菜单的资源 ID是一样的。也就是说,在 MFC编
程中,一个 ID可以表示多种资源。
接着, CMainFrame类的 OnCreate函数调用工具栏对象的 EnableDocking成员函数设置工具栏停靠
的位置,工具栏停靠位置的取值如表 9.2所示。
表 9.2工具栏停靠位置
说明
停靠位置允许停靠在客户区的顶部
CBRS ALIGN TOP
允许停靠在客户区的底部
CBRS_ALIGN_BOITOM
允许停靠在客户区的左边
CBRS_ALIGN_LEFI'
允许停靠在客户区的右边 允许停靠在客户区的任意一边
CBRS_ALIGN_RIGHT
CBRS.-ALIGN_ANY
允许多个控制条在二个单一的小框架窗口中浮动
CBRS_FLOAT_MULT1
接下来, CMainFrame类的OnCreate函数又调用了一个 EnableDocking函数,很多初学者看到这里的
代码总是会有一些疑惑,不知道这两个 EnableDocking函数到底是什么含义。读者一定要注意,先
前第一次调用的 EnableDocking函数是工具栏对象的成员函数,目的是让工具栏对象可以停靠,而
这里调用的是 CFrameWnd对象的 EnableDocking成员
函数,目的是让主框架窗口可以被停靠,停靠位置是表9.2所列的前五种。最后, CMainFrame类的
OnCreate函数调用DockControlBar函数,让工具栏停靠在主框架窗口上。
3.创建自定义的工具栏
下面,我们就按照上面所讲的第一种创建工具栏的方法,为 Style程序创建一个自己的工具栏。首
先,为 Style程序插入一个新的工具栏资源。方法之一是选择VC++开发窗口上的
【Insert\Resource...】菜单命令,在弹出的插入资源对话框中选择Toolbar资源类型(如图
9.20所示),然后单击【New】按钮插入新的工具栏。
图9.20利用lnsertResource对话框插入新的工具栏资源
另一种插入新工具栏资源的方法是,在工程的ResourceView选项卡上,在Toolbar文件夹上单击鼠标
右键,从弹出的快捷菜单中选择【InsertToolbar】菜单命令 (如图9.21所示),即可插入新的工具
栏资源。
图 9.21利用lnsertToolbar快捷菜单插入新的工具栏资源
无论使用上述哪种方法,这时 VC++都会在 Style程序中插入一个名为 IDR TOOLBARl的工具栏资源,
并且该工具栏上只有一个空白的按钮。然后,我们就可以根据需要在该按钮上绘制图形。本例在这
个新工具栏上又添加了两个按钮,并分别为这三个按钮绘制了图形:矩形、椭圆和圆形,结果如图9.22
所示。
遵照上面所说的创建步骤,接下来就是要构造一个 CToolbar对象,也就是为 CMainFrame类添加一个
CToolBar类型的成员变量,本例在该类的头文件中添加下面这条语句:
CToolBar m_newToolBar;
第三步,调用 Create或 CreateEx函数创建工具栏,并与 CToo.ar对象相关联。这可以在 CMai
nFrame类的 OnCreate函数中实现,在该函数中添加如例如 13所示代码中加灰显示的部分。
例 9-13
int CMainFrame : :OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_hIcons[O] =Loa dIcon(AfxGet工 nstanceHandle(), MAKE工 NTRESOURCE (ID工 _ICON1) )
.
, m_hIcons[1]=LoadIcon(theApp.m_hInstance , MAKEINTRESOURCE(IDI_ICON2)); ) ) .,
m_hIcons[2]=Load工 con(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON3
SetClassLong (m_hWnd, GCL_HICON , (LONG)m_h工 cons [0]);
SetTimer(1 , 1000 , NULL) ;
if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
I CBRS_GRIPPER I CBRS_TOOLTIPS I CBRS_FLYBY CBRS_S工 ZE_DYNAMIC)
II !m_newToolBar.LoadToolBar(IDR_TOOLBAR1))
{
TRACE0("Failed to create toolbar\n" ) ;
return -1; // fail to create
}
m_newToolBar.EnableDocking(CBRS_AL工 GN_ANY) ;
DockControlBar(&m_newToolBar) ;
return 0;
这段新添加的代码首先调用 CToolBar的成员函数: CreateEx创建工具栏,并与工具栏对象 :
m_oewToolBar相关联,这里将新工具栏的停靠位置设置为 CBRS_RIGHT,然后调用 LoadToolB ar函
数加载我们刚刚新建的工具栏资源 CIDR_TOOLBARl)。接着,调用工具栏对象的 EnableDocking函数
允许工具栏停靠于客户区的任意位置 C CBRS ALIGN_ANY )。因为在 OnCreate函数的前面己经调用
了框架类的 EnábleDocking函数,让主框架窗口可以被停靠,所以这里就不需要再调用这个函数了。
上述新添加代码的最后调用框架类的 DockCon位olBar函数,让这个新工具栏停靠在主框架窗口上。
Build井运行 Style程序,程序界面如图 9.23所示,可以看到在程序主框架窗口的右边
多了一个工具栏,就是刚才新建的那个工具栏。 因为程序还没有对该工具栏上的三个按钮
进行命令消息响应,所以它们都是变灰的。
图 9.23新添加的工具栏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -