工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示。当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现。将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省去了在级联菜单中一层层查找菜单项的麻烦。
6.2.1 工具栏类CToolBar
在MFC类库中,CToolBar类封装了工具栏的基本功能,CToolBar类的主要方法如下。
(1)Create方法:该方法用于创建工具栏窗口。语法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT
nID = AFX_IDW_TOOLBAR );
参数说明
(2)CreateEx方法:该方法与Create方法类似,用于创建工具栏窗口,只是该方法支持扩展风格。语法如下:
BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);
参数说明
(3)SetSizes方法:该方法用于设置按钮和位图的大小。语法如下:
void SetSizes( SIZE sizeButton, SIZE sizeImage );
参数说明
(4)SetHeight方法:该方法用于设置工具栏的高度。语法如下:
void SetHeight( int cyHeight );
参数说明
(5)LoadToolBar方法:该方法用于加载工具栏资源。语法如下:
BOOL LoadToolBar( LPCTSTR lpszResourceName );
BOOL LoadToolBar( UINT nIDResource );
参数说明
返回值:如果函数执行成功,返回值是非零,否则为零。
(6)LoadBitmap方法:该方法用于加载一个位图资源,位图中包含了每个工具栏按钮的图像。语法如下:
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
参数说明
返回值:执行成功,返回值是非零,否则为零。
(7)SetBitmap方法:该方法用于设置工具栏按钮位图。语法如下:
BOOL SetBitmap( HBITMAP hbmImageWell );
参数说明
(8)SetButtons方法:该方法用于向工具栏中添加按钮,并设置按钮的ID和图像索引。语法如下:
BOOL SetButtons( const UINT* lpIDArray, int nIDCount );
参数说明
(9)CommandToIndex方法:该方法根据工具栏按钮ID返回按钮索引。语法如下:
int CommandToIndex( UINT nIDFind );
参数说明
返回值:返回按钮ID对应的按钮索引,如果按钮ID没有对应的按钮,返回值为-1。
(10)GetItemID方法:该方法根据按钮索引返回按钮ID。语法如下:
UINT GetItemID( int nIndex ) const;
参数说明
返回值:返回按钮的ID,如果nIndex标识的按钮是一个分隔条,返回值是ID_SEPARATOR。
(11)GetItemRect方法:该方法根据按钮索引获取工具栏按钮的显示区域。语法如下:
virtual void GetItemRect( int nIndex, LPRECT lpRect );
参数说明
(12)GetButtonStyle方法:该方法用于获得按钮的风格。语法如下:
UINT GetButtonStyle( int nIndex ) const;
参数如下
(13)SetButtonStyle方法:该方法用于设置某个按钮的风格。语法如下:
void SetButtonStyle( int nIndex, UINT nStyle );
参数说明
(14)GetButtonInfo方法:该方法用于获取按钮信息。语法如下:
void GetButtonInfo( int nIndex, UINT& nID, UINT& nStyle, int& iImage ) const;
参数说明
iImage:用于接收按钮的图像索引。
(15)SetButtonInfo方法:该方法用于设置按钮的信息。语法如下:
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );
参数说明
(16)GetButtonText方法:该方法用于获取工具栏按钮文本。语法如下:
CString GetButtonText( int nIndex ) const;
void GetButtonText( int nIndex, CString& rString ) const;
参数说明
(17)SetButtonText方法:该方法用于设置按钮文本。语法如下:
BOOL SetButtonText( int nIndex, LPCTSTR lpszText );
参数说明
(18)GetToolBarCtrl方法:该方法用于访问底层的工具栏按钮通用控件。语法如下:
CToolBarCtrl& GetToolBarCtrl( ) const;
6.2.2 工具栏资源设计
在开发文档视图结构的应用程序时,系统会自动创建工具栏。但是如果开发基于对话框的应用程序,就需要用户自己创建工具栏了。在创建基于对话框的应用程序时,默认情况下,是不会创建工具栏资源的。如果用户想要设计工具栏,可以通过工作区的ResourceView来创建工具栏资源。
(1)在工作区的ResourceView中鼠标右键单击某个节点,在弹出的快捷菜单中选择“Insert”菜单项,打开“Insert Resource”对话框,如图6.19所示。
图6.19 “Insert Resource”对话框
(2)选择“Toolbar”选项,单击“New”按钮创建工具栏资源,如图6.20所示。
(3)在工具栏资源中绘制工具栏按钮。当用户在按钮上绘制图像后,工具栏窗口会自动创建一个新的工具栏按钮,如图6.21所示。
(4)如果用户想要删除工具栏资源中的某个按钮,可以先选中该按钮,然后按住鼠标左键,将其拖出工具栏。
(5)在设计完工具栏按钮后,需要为工具栏按钮设置命令ID,如果不指定ID,系统会为每个工具栏按钮设置一个默认的ID。双击工具栏按钮或者选中工具栏按钮后按<Enter>键打开“Toolbar Button Properties”窗口,通过“Toolbar Button Properties”窗口可以设置工具栏按钮命令ID、大小和提示,如图6.22所示。
图6.22 “Toolbar Button Properties”窗口
6.2.3 工具栏的命令处理
同菜单一样,每一个工具栏按钮都有一个命令ID,通过命令ID,可以编写命令消息处理函数。当单击工具栏按钮时,会执行消息处理函数。下面介绍如何编写消息处理函数。
(1)打开类向导,选择“Message Maps”选项卡,在“Class name”列表框选择创建了工具栏的对话框类,在“Object Ids”列表中选择工具栏按钮ID,在“Messages”列表中选择“COMMAND”项,如图6.23所示。
图6.23
(2)单击“Add Function…”按钮,弹出“Add Member Function”对话框,并给出默认时的命令处理函数名,如图6.24所示。
图6.24 “Add Member Function”对话框
(3)单击“OK”按钮,就添加了工具栏按钮的命令处理函数。
6.2.4 动态创建工具栏
工具栏的创建大体有3种方法。第1种方法是先设计一个位图,其中包含了工具栏中的所有按钮图像,每个按钮图像具有相同的大小,然后调用LoadBitmap方法加载位图,最后调用SetButtons方法添加按钮,设置按钮ID和图像索引;第2种方法是定义一个图像列表CImageList对象,向该对象中添加图像,然后将图像列表关联到工具栏中;第3种方法是创建一个工具栏资源,然后调用LoadToolBar方法加载工具栏资源。下面分别介绍这3种方法的应用。
1.第1种方法
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入一个位图,如图6.25所示。
图6.25
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,代码如下:
CToolBar m_ToolBar;
(4)处理“创建”按钮的单击事件,加载位图,创建工具栏,代码如下:
void CDynamicTool1Dlg::OnButton1()
{
}
程序运行结果如图6.26所示。
图6.26
2.第2种方法
(1)创建一个基于对话框应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入9个图标。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar和一个图像列表对象m_ImageList,代码如下:
CToolBar m_ToolBar;
CImageList m_ImageList;
(4)处理“创建”按钮的单击事件,加载图标,关联图像列表,创建工具栏,代码如下:
void CDynamicTool2Dlg::OnButton1()
{
}
程序运行结果如图6.27所示。
图6.27
3.第3种方法
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并创建一个工具栏资源,如图6.28所示。
图6.28
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,代码如下:
CToolBar m_ToolBar;
(4)处理“创建”按钮的单击事件,创建工具栏,加载工具栏资源,代码如下:
void CDynamicTool3Dlg::OnButton1()
{
}
程序运行结果如图6.29所示。
图6.29
6.2.5 工具栏按钮的热点效果
将工具栏设置成具有热点效果可以美化程序界面。
实现步骤如下。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向程序中导入16个图标。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar和两个图像列表对象m_ImageList、m_HotImageList,代码如下:
CToolBar m_ToolBar;
CImageList m_ImageList;
CImageList m_HotImageList;
其中,m_ImageList是工具栏按钮的图像列表对象,m_HotImageList是工具栏按钮的热点图像列表对象。
(4)在OnInitDialog函数中加载图标,关联图像列表,创建工具栏,代码如下:
BOOL CHotToolDlg::OnInitDialog()
{
}
在创建具有热点效果的工具栏时,需要使用CreateEx创建工具栏窗口,只有创建的工具栏窗口具有TBSTYLE_FLAT属性时,工具栏按钮才具有热点效果。然后要使用工具栏控制类的SetHotImageList方法关联热点图像列表。
程序运行结果如图6.30所示。
图6.30
6.2.6 具有提示功能的工具栏
系统中的工具栏是没有文本显示的,为了使用户能清楚地知道每个工具栏按钮的用途,除了形象的图像外,还应该具有提示功能,下面就来看一下工具栏的提示功能是如何实现的。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入一个位图,如图6.31所示。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,并声明一个CString的变量str来保存工具栏按钮文本,代码如下:
CToolBar m_ToolBar;
CString str;
(4)在OnInitDialog函数中加载位图,创建工具栏,代码如下:
BOOL CToolTipDlg::OnInitDialog()
{
}
EnableToolTips方法用于激活工具栏的提示功能。
(5)在主窗口的消息映射部分添加ON_NOTIFY_EX映射宏,代码如下:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)
(6)在主窗口的头文件中添加对OnToolTipNotify函数的声明,代码如下:
afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
(7)添加消息处理函数OnToolTipNotify的实现部分,代码如下:
BOOL CToolTipDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
}
OnToolTipNotify是处理TTN_NEEDTEXT消息的函数,其中参数id是发送消息的控件ID;参数pNMHDR是一个NMHDR结构指针,该结构记录了发送消息的控件ID、句柄等信息;参数pResult表示结果代码指针,TTN_NEEDTEXT消息可以忽略该参数。
程序运行结果如图6.32所示。
图6.32
6.2.7 带下拉按钮的工具栏
在工具栏按钮的旁边添加一个呈倒三角形的下拉按钮可以扩展工具栏按钮的选择功能。下拉按钮在按下后会弹出一个下拉菜单,下拉菜单中的选项就是对按钮增强的功能。下面来介绍一下如何为工具栏添加下拉按钮。
(1)创建一个基于单文档的应用程序。
(2)新建一个菜单资源,如图6.33所示。
(3)修改工具栏资源,为工具栏添加一个修改字体按钮,如图6.34所示。
(4)在框架头文件中修改工具栏风格,使“A”按钮具有下拉按钮,代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
}
SetExtendedStyle是CToolBarCtrl类的方法,该方法用于设置工具栏控件的扩展风格,语法如下:
DWORD SetExtendedStyle( DWORD dwExStyle ) const;
参数说明
l
(5)在框架源文件消息映射宏中添加如下代码:
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
(6)在框架的头文件中添加消息响应函数的声明,代码如下:
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
(7)OnToolbarDropDown函数的实现代码如下:
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
}
CWnd类的ClientToScreen方法用于将客户坐标转换成屏幕坐标,TrackPopupMenu方法用于弹出菜单。
(8)在视图头文件中声明一个CFont类型变量Font,并在构造函数中初始化变量Font。重载OnDraw函数,设置视图中的显示文本。
(9)通过类向导为新创建的菜单和工具栏按钮添加消息处理函数,代码如下:
void CDropToolBarView::OnFont()
{
}
void CDropToolBarView::OnMenu200()
{
}
void CDropToolBarView::OnMenu150()
{
}
void CDropToolBarView::OnMenu100()
{
}
void CDropToolBarView::OnMenu50()
{
}
程序运行结果如图6.35所示。
图6.35
6.2.8 工具栏控制类CToolBarCtrl
CToolBarCtrl类提供了Windows通用工具栏控制功能,是一个矩形子窗口,包含一个或多个按钮,这些按钮可以显示位图图像、字符文本或两者都有。
CToolBarCtrl类的主要方法如表6.1所示。
表6.1
方 |
描 |
Create |
创建工具栏并将它与一个CToolBarCtrl类对象连接 |
IsButtonEnabled |
指示工具栏中的指定按钮是否有效 |
IsButtonChecked |
指示工具栏中的指定按钮是否被选中 |
IsButtonPressed |
指示工具栏中的指定按钮是否被按下 |
IsButtonHidden |
指示工具栏中的指定按钮是否隐藏 |
IsButtonIndeterminate |
指示工具栏中的指定按钮的状态是否不可用[g1] |
SetState |
设置工具栏中的指定按钮的状态 |
GetState |
获取工具栏中的指定按钮的状态 |
GetButton |
获取工具栏中的指定按钮 |
GetButtonCount |
获取工具栏按钮的数目 |
GetItemRect |
获取工具栏按钮的边界矩形 |
GetRect |
获取一个指定工具栏按钮的边界矩形 |
SetButtonStructSize |
指定TBBUTTON结构的大小 |
GetButtonSize |
获取当前工具栏按钮的大小 |
SetButtonSize |
设置当前工具栏按钮的大小 |
SetBitmapSize |
设置工具栏按钮的图像大小 |
续表
方 |
描 |
GetToolTips |
获取与此工具栏相关联的工具栏提示的句柄 |
SetToolTips |
将工具栏提示与工具栏进行关联 |
SetOwner |
设置接收工具栏通知消息的按钮 |
SetRows |
设置工具栏按钮的行数 |
GetRows |
获取工具栏按钮的行数 |
SetCmdID |
设置当按钮被按下时要发送到主窗口的命令ID |
GetBitmapFlags |
获取与工具栏位图相关联的标志 |
GetDisabledImageList |
获取工具栏用来显示无效按钮的图像列表 |
GetHotImageList |
获取工具栏用来显示热点按钮的图像列表 |
GetImageList |
获取工具栏默认时的图像列表 |
GetStyle |
获取工具栏当前的风格 |
GetMaxTextRows |
获取工具栏按钮的显示文本的最大行数 |
IsButtonHighlighted |
检查工具栏按钮的加亮状态 |
SetButtonWidth |
设置工具栏按钮宽度的最大值和最小值 |
SetDisabledImageList |
设置工具栏用来显示无效按钮的图像列表 |
SetHotImageList |
设置工具栏用来显示热点按钮的图像列表 |
SetImageList |
设置工具栏默认时的图像列表 |
GetDropTarget |
设置工具栏的IDropTarget接口 |
SetIndent |
设置工具栏中第一个按钮的缩进 |
SetMaxTextRows |
设置工具栏按钮的显示文本的最大行数 |
SetStyle |
设置工具栏当前的风格 |
GetAnchorHighlight |
获取工具栏的加亮设置 |
SetAnchorHighlight |
对工具栏进行加亮设置 |
GetHotItem |
获取工具栏热点项索引 |
SetHotItem |
设置工具栏热点项索引 |
GetInsertMark |
获取工具栏的当前插入标记 |
SetInsertMark |
设置工具栏的当前插入标记 |
GetMaxSize |
获取工具栏可视按钮和分隔条的总大小 |
InsertMarkHitTest |
获取工具栏中指定点的插入信息 |
GetExtendedStyle |
获取工具栏的扩展风格 |
SetExtendedStyle |
设置工具栏的扩展风格 |
GetInsertMarkColor |
获取工具栏插入标记的颜色 |
SetInsertMarkColor |
设置工具栏插入标记的颜色 |
MapAccelerator |
将一个加速键映射到一个工具栏按钮 |
MoveButton |
将一个工具栏按钮从一个索引移动到另一个索引 |
HitTest |
确定一个点位于工具栏的具体位置 |
EnableButton |
设置工具栏按钮是否有效 |
CheckButton |
是否选中工具栏中的指定按钮 |
PressButton |
是否按下工具栏中的指定按钮 |
GetButtonInfo |
获取工具栏指定按钮的信息 |
续表
方 |
描 |
SetButtonInfo |
设置工具栏指定按钮的信息 |
SetDrawTextFlags |
设置Win32中DrawText功能标志 |
HideButton |
隐藏或显示工具栏中的指定按钮 |
Indeterminate |
设置工具栏中指定按钮是否灰色状态 |
AddBitmap |
将位图图像添加到工具栏可用的图像列表中 |
AddButtons |
将按钮添加到工具栏中 |
InsertButton |
在工具栏中插入按钮 |
DeleteButton |
从工具栏中删除按钮 |
CommandToIndex |
获取与指定命令ID相关联的索引 |
RestoreState |
恢复工具栏状态 |
MarkButton |
设置工具栏的高亮显示状态 |
LoadImages |
将位图装载到工具栏的图像列表中 |
SaveState |
保存工具栏状态 |
Customize |
显示CustomizeToolBar对话框 |
AddString |
将作为资源ID传递的一个字符串添加到工具栏的内部字符串列表中 |
AddStrings |
将多个字符串添加到工具栏的内部字符串列表中 |
AutoSize |
调整工具栏的大小 |
下面使用CToolBarCtrl类创建一个工具栏。
步骤如下。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入8个图标。
(3)在主窗口头文件中声明一个CToolBarCtrl类对象m_ToolBar和一个图像列表对象m_ImageList,代码如下:
CToolBarCtrl m_ToolBar;
CImageList m_ImageList;
(4)在工作区窗口中选择ResourceView,展开String Table节点,双击abc String Table节点,打开字符串编辑器,在字符串编辑器中设置工具栏按钮的显示文本,如图6.36所示。
图6.36
(5)在OnInitDialog函数中加载图标,关联图像列表,创建工具栏,代码如下:
BOOL CToolCtrlDlg::OnInitDialog()
{
}
出自: http://lmx18.blog.163.com/blog/static/434936792013727102116830/
工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标来表示。当单击某个按钮时,会产生一个相应的消息,对这个消息的处理就是按钮的功能实现。将菜单中常用的功能放置在工具栏中,这样可以方便用户操作,省去了在级联菜单中一层层查找菜单项的麻烦。
6.2.1 工具栏类CToolBar
在MFC类库中,CToolBar类封装了工具栏的基本功能,CToolBar类的主要方法如下。
(1)Create方法:该方法用于创建工具栏窗口。语法如下:
BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP, UINT
nID = AFX_IDW_TOOLBAR );
参数说明
(2)CreateEx方法:该方法与Create方法类似,用于创建工具栏窗口,只是该方法支持扩展风格。语法如下:
BOOL CreateEx(CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR);
参数说明
(3)SetSizes方法:该方法用于设置按钮和位图的大小。语法如下:
void SetSizes( SIZE sizeButton, SIZE sizeImage );
参数说明
(4)SetHeight方法:该方法用于设置工具栏的高度。语法如下:
void SetHeight( int cyHeight );
参数说明
(5)LoadToolBar方法:该方法用于加载工具栏资源。语法如下:
BOOL LoadToolBar( LPCTSTR lpszResourceName );
BOOL LoadToolBar( UINT nIDResource );
参数说明
返回值:如果函数执行成功,返回值是非零,否则为零。
(6)LoadBitmap方法:该方法用于加载一个位图资源,位图中包含了每个工具栏按钮的图像。语法如下:
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
参数说明
返回值:执行成功,返回值是非零,否则为零。
(7)SetBitmap方法:该方法用于设置工具栏按钮位图。语法如下:
BOOL SetBitmap( HBITMAP hbmImageWell );
参数说明
(8)SetButtons方法:该方法用于向工具栏中添加按钮,并设置按钮的ID和图像索引。语法如下:
BOOL SetButtons( const UINT* lpIDArray, int nIDCount );
参数说明
(9)CommandToIndex方法:该方法根据工具栏按钮ID返回按钮索引。语法如下:
int CommandToIndex( UINT nIDFind );
参数说明
返回值:返回按钮ID对应的按钮索引,如果按钮ID没有对应的按钮,返回值为-1。
(10)GetItemID方法:该方法根据按钮索引返回按钮ID。语法如下:
UINT GetItemID( int nIndex ) const;
参数说明
返回值:返回按钮的ID,如果nIndex标识的按钮是一个分隔条,返回值是ID_SEPARATOR。
(11)GetItemRect方法:该方法根据按钮索引获取工具栏按钮的显示区域。语法如下:
virtual void GetItemRect( int nIndex, LPRECT lpRect );
参数说明
(12)GetButtonStyle方法:该方法用于获得按钮的风格。语法如下:
UINT GetButtonStyle( int nIndex ) const;
参数如下
(13)SetButtonStyle方法:该方法用于设置某个按钮的风格。语法如下:
void SetButtonStyle( int nIndex, UINT nStyle );
参数说明
(14)GetButtonInfo方法:该方法用于获取按钮信息。语法如下:
void GetButtonInfo( int nIndex, UINT& nID, UINT& nStyle, int& iImage ) const;
参数说明
iImage:用于接收按钮的图像索引。
(15)SetButtonInfo方法:该方法用于设置按钮的信息。语法如下:
void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );
参数说明
(16)GetButtonText方法:该方法用于获取工具栏按钮文本。语法如下:
CString GetButtonText( int nIndex ) const;
void GetButtonText( int nIndex, CString& rString ) const;
参数说明
(17)SetButtonText方法:该方法用于设置按钮文本。语法如下:
BOOL SetButtonText( int nIndex, LPCTSTR lpszText );
参数说明
(18)GetToolBarCtrl方法:该方法用于访问底层的工具栏按钮通用控件。语法如下:
CToolBarCtrl& GetToolBarCtrl( ) const;
6.2.2 工具栏资源设计
在开发文档视图结构的应用程序时,系统会自动创建工具栏。但是如果开发基于对话框的应用程序,就需要用户自己创建工具栏了。在创建基于对话框的应用程序时,默认情况下,是不会创建工具栏资源的。如果用户想要设计工具栏,可以通过工作区的ResourceView来创建工具栏资源。
(1)在工作区的ResourceView中鼠标右键单击某个节点,在弹出的快捷菜单中选择“Insert”菜单项,打开“Insert Resource”对话框,如图6.19所示。
图6.19 “Insert Resource”对话框
(2)选择“Toolbar”选项,单击“New”按钮创建工具栏资源,如图6.20所示。
(3)在工具栏资源中绘制工具栏按钮。当用户在按钮上绘制图像后,工具栏窗口会自动创建一个新的工具栏按钮,如图6.21所示。
(4)如果用户想要删除工具栏资源中的某个按钮,可以先选中该按钮,然后按住鼠标左键,将其拖出工具栏。
(5)在设计完工具栏按钮后,需要为工具栏按钮设置命令ID,如果不指定ID,系统会为每个工具栏按钮设置一个默认的ID。双击工具栏按钮或者选中工具栏按钮后按<Enter>键打开“Toolbar Button Properties”窗口,通过“Toolbar Button Properties”窗口可以设置工具栏按钮命令ID、大小和提示,如图6.22所示。
图6.22 “Toolbar Button Properties”窗口
6.2.3 工具栏的命令处理
同菜单一样,每一个工具栏按钮都有一个命令ID,通过命令ID,可以编写命令消息处理函数。当单击工具栏按钮时,会执行消息处理函数。下面介绍如何编写消息处理函数。
(1)打开类向导,选择“Message Maps”选项卡,在“Class name”列表框选择创建了工具栏的对话框类,在“Object Ids”列表中选择工具栏按钮ID,在“Messages”列表中选择“COMMAND”项,如图6.23所示。
图6.23
(2)单击“Add Function…”按钮,弹出“Add Member Function”对话框,并给出默认时的命令处理函数名,如图6.24所示。
图6.24 “Add Member Function”对话框
(3)单击“OK”按钮,就添加了工具栏按钮的命令处理函数。
6.2.4 动态创建工具栏
工具栏的创建大体有3种方法。第1种方法是先设计一个位图,其中包含了工具栏中的所有按钮图像,每个按钮图像具有相同的大小,然后调用LoadBitmap方法加载位图,最后调用SetButtons方法添加按钮,设置按钮ID和图像索引;第2种方法是定义一个图像列表CImageList对象,向该对象中添加图像,然后将图像列表关联到工具栏中;第3种方法是创建一个工具栏资源,然后调用LoadToolBar方法加载工具栏资源。下面分别介绍这3种方法的应用。
1.第1种方法
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入一个位图,如图6.25所示。
图6.25
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,代码如下:
CToolBar m_ToolBar;
(4)处理“创建”按钮的单击事件,加载位图,创建工具栏,代码如下:
void CDynamicTool1Dlg::OnButton1()
{
}
程序运行结果如图6.26所示。
图6.26
2.第2种方法
(1)创建一个基于对话框应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入9个图标。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar和一个图像列表对象m_ImageList,代码如下:
CToolBar m_ToolBar;
CImageList m_ImageList;
(4)处理“创建”按钮的单击事件,加载图标,关联图像列表,创建工具栏,代码如下:
void CDynamicTool2Dlg::OnButton1()
{
}
程序运行结果如图6.27所示。
图6.27
3.第3种方法
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并创建一个工具栏资源,如图6.28所示。
图6.28
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,代码如下:
CToolBar m_ToolBar;
(4)处理“创建”按钮的单击事件,创建工具栏,加载工具栏资源,代码如下:
void CDynamicTool3Dlg::OnButton1()
{
}
程序运行结果如图6.29所示。
图6.29
6.2.5 工具栏按钮的热点效果
将工具栏设置成具有热点效果可以美化程序界面。
实现步骤如下。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向程序中导入16个图标。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar和两个图像列表对象m_ImageList、m_HotImageList,代码如下:
CToolBar m_ToolBar;
CImageList m_ImageList;
CImageList m_HotImageList;
其中,m_ImageList是工具栏按钮的图像列表对象,m_HotImageList是工具栏按钮的热点图像列表对象。
(4)在OnInitDialog函数中加载图标,关联图像列表,创建工具栏,代码如下:
BOOL CHotToolDlg::OnInitDialog()
{
}
在创建具有热点效果的工具栏时,需要使用CreateEx创建工具栏窗口,只有创建的工具栏窗口具有TBSTYLE_FLAT属性时,工具栏按钮才具有热点效果。然后要使用工具栏控制类的SetHotImageList方法关联热点图像列表。
程序运行结果如图6.30所示。
图6.30
6.2.6 具有提示功能的工具栏
系统中的工具栏是没有文本显示的,为了使用户能清楚地知道每个工具栏按钮的用途,除了形象的图像外,还应该具有提示功能,下面就来看一下工具栏的提示功能是如何实现的。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入一个位图,如图6.31所示。
(3)在主窗口头文件中声明一个CToolBar类对象m_ToolBar,并声明一个CString的变量str来保存工具栏按钮文本,代码如下:
CToolBar m_ToolBar;
CString str;
(4)在OnInitDialog函数中加载位图,创建工具栏,代码如下:
BOOL CToolTipDlg::OnInitDialog()
{
}
EnableToolTips方法用于激活工具栏的提示功能。
(5)在主窗口的消息映射部分添加ON_NOTIFY_EX映射宏,代码如下:
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNotify)
(6)在主窗口的头文件中添加对OnToolTipNotify函数的声明,代码如下:
afx_msg BOOL OnToolTipNotify( UINT id, NMHDR * pNMHDR, LRESULT * pResult );
(7)添加消息处理函数OnToolTipNotify的实现部分,代码如下:
BOOL CToolTipDlg::OnToolTipNotify(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
}
OnToolTipNotify是处理TTN_NEEDTEXT消息的函数,其中参数id是发送消息的控件ID;参数pNMHDR是一个NMHDR结构指针,该结构记录了发送消息的控件ID、句柄等信息;参数pResult表示结果代码指针,TTN_NEEDTEXT消息可以忽略该参数。
程序运行结果如图6.32所示。
图6.32
6.2.7 带下拉按钮的工具栏
在工具栏按钮的旁边添加一个呈倒三角形的下拉按钮可以扩展工具栏按钮的选择功能。下拉按钮在按下后会弹出一个下拉菜单,下拉菜单中的选项就是对按钮增强的功能。下面来介绍一下如何为工具栏添加下拉按钮。
(1)创建一个基于单文档的应用程序。
(2)新建一个菜单资源,如图6.33所示。
(3)修改工具栏资源,为工具栏添加一个修改字体按钮,如图6.34所示。
(4)在框架头文件中修改工具栏风格,使“A”按钮具有下拉按钮,代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
}
SetExtendedStyle是CToolBarCtrl类的方法,该方法用于设置工具栏控件的扩展风格,语法如下:
DWORD SetExtendedStyle( DWORD dwExStyle ) const;
参数说明
l
(5)在框架源文件消息映射宏中添加如下代码:
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnToolbarDropDown)
(6)在框架的头文件中添加消息响应函数的声明,代码如下:
afx_msg void OnToolbarDropDown(NMTOOLBAR* pnmh, LRESULT* plRes);
(7)OnToolbarDropDown函数的实现代码如下:
void CMainFrame::OnToolbarDropDown(NMTOOLBAR* pnmtb, LRESULT *plr)
{
}
CWnd类的ClientToScreen方法用于将客户坐标转换成屏幕坐标,TrackPopupMenu方法用于弹出菜单。
(8)在视图头文件中声明一个CFont类型变量Font,并在构造函数中初始化变量Font。重载OnDraw函数,设置视图中的显示文本。
(9)通过类向导为新创建的菜单和工具栏按钮添加消息处理函数,代码如下:
void CDropToolBarView::OnFont()
{
}
void CDropToolBarView::OnMenu200()
{
}
void CDropToolBarView::OnMenu150()
{
}
void CDropToolBarView::OnMenu100()
{
}
void CDropToolBarView::OnMenu50()
{
}
程序运行结果如图6.35所示。
图6.35
6.2.8 工具栏控制类CToolBarCtrl
CToolBarCtrl类提供了Windows通用工具栏控制功能,是一个矩形子窗口,包含一个或多个按钮,这些按钮可以显示位图图像、字符文本或两者都有。
CToolBarCtrl类的主要方法如表6.1所示。
表6.1
方 |
描 |
Create |
创建工具栏并将它与一个CToolBarCtrl类对象连接 |
IsButtonEnabled |
指示工具栏中的指定按钮是否有效 |
IsButtonChecked |
指示工具栏中的指定按钮是否被选中 |
IsButtonPressed |
指示工具栏中的指定按钮是否被按下 |
IsButtonHidden |
指示工具栏中的指定按钮是否隐藏 |
IsButtonIndeterminate |
指示工具栏中的指定按钮的状态是否不可用[g1] |
SetState |
设置工具栏中的指定按钮的状态 |
GetState |
获取工具栏中的指定按钮的状态 |
GetButton |
获取工具栏中的指定按钮 |
GetButtonCount |
获取工具栏按钮的数目 |
GetItemRect |
获取工具栏按钮的边界矩形 |
GetRect |
获取一个指定工具栏按钮的边界矩形 |
SetButtonStructSize |
指定TBBUTTON结构的大小 |
GetButtonSize |
获取当前工具栏按钮的大小 |
SetButtonSize |
设置当前工具栏按钮的大小 |
SetBitmapSize |
设置工具栏按钮的图像大小 |
续表
方 |
描 |
GetToolTips |
获取与此工具栏相关联的工具栏提示的句柄 |
SetToolTips |
将工具栏提示与工具栏进行关联 |
SetOwner |
设置接收工具栏通知消息的按钮 |
SetRows |
设置工具栏按钮的行数 |
GetRows |
获取工具栏按钮的行数 |
SetCmdID |
设置当按钮被按下时要发送到主窗口的命令ID |
GetBitmapFlags |
获取与工具栏位图相关联的标志 |
GetDisabledImageList |
获取工具栏用来显示无效按钮的图像列表 |
GetHotImageList |
获取工具栏用来显示热点按钮的图像列表 |
GetImageList |
获取工具栏默认时的图像列表 |
GetStyle |
获取工具栏当前的风格 |
GetMaxTextRows |
获取工具栏按钮的显示文本的最大行数 |
IsButtonHighlighted |
检查工具栏按钮的加亮状态 |
SetButtonWidth |
设置工具栏按钮宽度的最大值和最小值 |
SetDisabledImageList |
设置工具栏用来显示无效按钮的图像列表 |
SetHotImageList |
设置工具栏用来显示热点按钮的图像列表 |
SetImageList |
设置工具栏默认时的图像列表 |
GetDropTarget |
设置工具栏的IDropTarget接口 |
SetIndent |
设置工具栏中第一个按钮的缩进 |
SetMaxTextRows |
设置工具栏按钮的显示文本的最大行数 |
SetStyle |
设置工具栏当前的风格 |
GetAnchorHighlight |
获取工具栏的加亮设置 |
SetAnchorHighlight |
对工具栏进行加亮设置 |
GetHotItem |
获取工具栏热点项索引 |
SetHotItem |
设置工具栏热点项索引 |
GetInsertMark |
获取工具栏的当前插入标记 |
SetInsertMark |
设置工具栏的当前插入标记 |
GetMaxSize |
获取工具栏可视按钮和分隔条的总大小 |
InsertMarkHitTest |
获取工具栏中指定点的插入信息 |
GetExtendedStyle |
获取工具栏的扩展风格 |
SetExtendedStyle |
设置工具栏的扩展风格 |
GetInsertMarkColor |
获取工具栏插入标记的颜色 |
SetInsertMarkColor |
设置工具栏插入标记的颜色 |
MapAccelerator |
将一个加速键映射到一个工具栏按钮 |
MoveButton |
将一个工具栏按钮从一个索引移动到另一个索引 |
HitTest |
确定一个点位于工具栏的具体位置 |
EnableButton |
设置工具栏按钮是否有效 |
CheckButton |
是否选中工具栏中的指定按钮 |
PressButton |
是否按下工具栏中的指定按钮 |
GetButtonInfo |
获取工具栏指定按钮的信息 |
续表
方 |
描 |
SetButtonInfo |
设置工具栏指定按钮的信息 |
SetDrawTextFlags |
设置Win32中DrawText功能标志 |
HideButton |
隐藏或显示工具栏中的指定按钮 |
Indeterminate |
设置工具栏中指定按钮是否灰色状态 |
AddBitmap |
将位图图像添加到工具栏可用的图像列表中 |
AddButtons |
将按钮添加到工具栏中 |
InsertButton |
在工具栏中插入按钮 |
DeleteButton |
从工具栏中删除按钮 |
CommandToIndex |
获取与指定命令ID相关联的索引 |
RestoreState |
恢复工具栏状态 |
MarkButton |
设置工具栏的高亮显示状态 |
LoadImages |
将位图装载到工具栏的图像列表中 |
SaveState |
保存工具栏状态 |
Customize |
显示CustomizeToolBar对话框 |
AddString |
将作为资源ID传递的一个字符串添加到工具栏的内部字符串列表中 |
AddStrings |
将多个字符串添加到工具栏的内部字符串列表中 |
AutoSize |
调整工具栏的大小 |
下面使用CToolBarCtrl类创建一个工具栏。
步骤如下。
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个按钮控件,并向工程中导入8个图标。
(3)在主窗口头文件中声明一个CToolBarCtrl类对象m_ToolBar和一个图像列表对象m_ImageList,代码如下:
CToolBarCtrl m_ToolBar;
CImageList m_ImageList;
(4)在工作区窗口中选择ResourceView,展开String Table节点,双击abc String Table节点,打开字符串编辑器,在字符串编辑器中设置工具栏按钮的显示文本,如图6.36所示。
图6.36
(5)在OnInitDialog函数中加载图标,关联图像列表,创建工具栏,代码如下:
BOOL CToolCtrlDlg::OnInitDialog()
{
}