⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 09.4.2 创建工具栏.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
📖 第 1 页 / 共 2 页
字号:
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 + -