创建工具条的基本步骤是:
1.创建工具条资源。
2.构建一个CToolBar对象。
3.调用CToolBar::Create函数创建工具条窗口。
4.调用CToolBar::LoadToolBar载入工具条资源。
使用工具条
打开资源视图,可视化创建或者修改工具条:
其中ID项一般与菜单中某项命令相同,工具栏中图标对应菜单命令,如果没有挂上消息响应改图标则自动为灰色(不可用)。
新建工具条的操作一样:
在主框架类中,照加载主工具条一样加载新建的工具条:
注意挂上消息(挂在视图类中)
对话框工具条
CDialogBar可以提供类似对话框的工具条,适用于创建比较复杂的工具条:
首先,创建一个对话框资源:
修改属性:
双击创建类,选择父类为CDialog,手动修改代码:
头文件:
#pragma once
// CDialogBarTest 对话框
class CDialogBarTest : public CDialogBar
{
DECLARE_DYNAMIC(CDialogBarTest)
public:
CDialogBarTest(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDialogBarTest();
// 对话框数据
enum { IDD = IDD_TEST_DIALOGBAR };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedStop();
};
源文件:
// DialogBarTest.cpp : 实现文件
//
#include "stdafx.h"
#include "MFC08.h"
#include "DialogBarTest.h"
#include "afxdialogex.h"
// CDialogBarTest 对话框
IMPLEMENT_DYNAMIC(CDialogBarTest, CDialogBar)
CDialogBarTest::CDialogBarTest(CWnd* pParent /*=NULL*/)
{
}
CDialogBarTest::~CDialogBarTest()
{
}
void CDialogBarTest::DoDataExchange(CDataExchange* pDX)
{
CDialogBar::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDialogBarTest, CDialogBar)
ON_BN_CLICKED(ID_STOP, &CDialogBarTest::OnBnClickedStop)
END_MESSAGE_MAP()
// CDialogBarTest 消息处理程序
void CDialogBarTest::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码
}
在主框架类的OnCreate 函数中添加代码:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndTestBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndTestBar.LoadToolBar(IDR_TEST))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
// TODO: 如果不需要可停靠工具栏,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndTestBar);
m_wndTestDialogBar.Create(this, IDD_TEST_DIALOGBAR, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_TEST_DIALOGBAR);
m_wndTestDialogBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndTestDialogBar);
return 0;
}
注意:新增的两个工具栏类的定义都放在主框架类的头文件中(包含相关头文件)
运行结果: