精通 VC++ 实效编程280例 - 03 把握栏
添加时间:2013-6-11 点击量:
Windows 应用法度的把握栏包含对象栏和状况栏等。在对象栏中可以添加按钮和控件,实现快捷操纵。在状况栏中可以显示一些提示信息。MFC 中,把握栏中的对象栏和状况栏分别经由过程 CToolBar 类和 CstatusBar 类实现,它们的父类都为 CContorlBar 类。
33 创建对象栏
创建对象栏,起建一个对象栏资料,然后机关一个 CToolBar 类对象,接下来调用 CToolBar::CreateEx 函数创建对象栏窗口,最后调用 CToolBar::LoadToolBar 函数加载对象栏资料。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
return 0;
}
34 设置对象栏题目
设置对象栏的题目可以调用CWnd::SetWindowText函数。
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//设置对象栏题目
CString strText = _T();
strText.LoadString(AFX_IDS_APP_TITLE);
m_wndToolBar.SetWindowText(strText);
//...
return 0;
}
35 停靠对象栏
停靠对象栏,起首调用CControlBar::EnableDocking函数和CFrameWnd::EnableDocking函数,然后调用CFrameWnd::DockControlBar函数。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
//在CMainFrame类中添加DockBar成员函数
void CMainFrame::DockBar(CControlBar pDestBar, CControlBar pSrcBar)
{
RecalcLayout(TRUE);
//获得对象栏窗口坐标
CRect rect;
pDestBar->GetWindowRect(&rect);
rect.OffsetRect(1, 0);
//获得对象栏风格
DWORD dwStyle = pDestBar->GetBarStyle();
UINT nDockBarID = 0;
if (dwStyle & CBRS_ALIGN_TOP)
{
nDockBarID = AFX_IDW_DOCKBAR_TOP;
}
else if (dwStyle & CBRS_ALIGN_BOTTOM)
{
nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
}
else if (dwStyle & CBRS_ALIGN_LEFT)
{
nDockBarID = AFX_IDW_DOCKBAR_LEFT;
}
else if (dwStyle & CBRS_ALIGN_RIGHT)
{
nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
}
//停靠对象栏
DockControlBar(pSrcBar, nDockBarID, &rect);
}
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
return 0;
}
36 设置对象栏位图
设置对象栏的位图可以调用CToolBar::SetBitmap函数。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,添加1个位图资料,ID为IDB_BITMAP1,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
CBitmap m_Bitmap;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
//停靠对象栏
m_wndDemoToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockBar(&m_wndToolBar,&m_wndDemoToolBar);
//设置位图
m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_wndDemoToolBar.SetBitmap((HBITMAP)m_Bitmap);
return 0;
}
37 为对象栏按钮添加文本标签
为对象栏按钮添加文本标签可以调用CToolBar::SetButtonText函数。
//创建1个多文档的应用法度,在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
for (int n = 0;n < m_wndToolBar.GetCount();n++)
{
//获得对象栏按钮ID
UINT nID = m_wndToolBar.GetItemID(n);
CString strText = _T();
if (!strText.LoadString(nID))
{
continue;
}
int nIndex = strText.Find(_T(\n));
if (nIndex < 0)
{
continue;
}
strText = strText.Right(strText.GetLength() - nIndex - 1);
//设置对象栏按钮文本
m_wndToolBar.SetButtonText(n,strText);
}
CRect rect;
m_wndToolBar.GetItemRect(0,&rect);
//设置对象栏按钮尺寸
m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
//...
return 0;
}
38 为对象栏按钮添加下拉箭头
为对象栏按钮添加下拉箭头,起首调用CToolBarCtrl::SetExtendedStyle函数,设置对象栏的TBSTYLE_EX_DRAWDDARROWS风格;然后调用CToolBar::SetButtonStyle函数,在每一个添加下拉箭头的按钮上设置TBSTYLE_DROPDOWN风格。
//创建1个多文档的应用法度,在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//设置对象栏扩大风格
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//设置对象栏按钮风格
int nIndex = m_wndToolBar.CommandToIndex(ID_FILE_NEW);
UINT nStyle = m_wndToolBar.GetButtonStyle(nIndex);
nStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(nIndex, nStyle);
//...
return 0;
}
//在CMainFrame类中为对象栏添加TBN_DROPDOWN消息处理惩罚函数
//在MainFrame.h头文件中参加消息处理惩罚函数的声明:
afx_msg void OnDropDownToolBar(NMHDR pNMHDR, LRESULT pResult);
//在MainFrame.cpp中参加下拉箭头的TBN_DROPDOWN消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDownToolBar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//TBN_DROPDOWN消息的实现:
void CMainFrame::OnDropDownToolBar(NMHDR pNMHDR, LRESULT pResult)
{
NMTOOLBAR pNMToolBar = (NMTOOLBAR)pNMHDR;
switch(pNMToolBar->iItem)
{
case ID_FILE_NEW:
::AfxMessageBox(_T(新建));
break;
default:
break;
}
}
39 为对象栏按钮设置热点图像
默认景象下,AppWizard应用对象栏资料来设置按钮的图像。对象栏资料包含一个复合的位图,该位图在调用CToolbar::LoadToolBar函数时将被转换成一个图像列表。
为对象栏按钮设置热点图像,应当起首调用CImageList::Create函数创建一个新的图像列表;然后调用CToolBarCtrl::SetHotImageList函数,将该图像列表设置为对象栏的热点图像列表。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量和WM_CREATE消息处理惩罚函数
private:
CImageList m_ImageList;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//创建图像列表
if (!m_ImageList.Create(IDB_BITMAP1,16,0,RGB(128,128,128)))
{
return -1;
}
//设置对象栏图像列表
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&m_ImageList);
//...
return 0;
}
40 启用或禁用对象栏的对象提示
启用和禁用对象栏的对象提示,可以经由过程调用CControlBar::SetBarStyle函数,添加或删除CBRS_TOOLTIPS风格实现。
//创建1个多文档的应用法度,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资料中添加1个子菜单,在子菜单中添加1个菜单项(ID:ID_ENABLE_TOOLTIPS)
//在CMainFrame类中为菜单项添加号令处理惩罚函数
void CMainFrame::OnEnableTooltips()
{
//获得对象栏风格
DWORD dwStyle = m_wndToolBar.GetBarStyle();
//启用或禁用对象提示
if (dwStyle & CBRS_TOOLTIPS)
{
dwStyle &= ~CBRS_TOOLTIPS;
}
else
{
dwStyle |= CBRS_TOOLTIPS;
}
//设置对象栏风格
m_wndToolBar.SetBarStyle(dwStyle);
}
void CMainFrame::OnUpdateEnableTooltips(CCmdUI pCmdUI)
{
//获得对象栏风格
DWORD dwStyle = m_wndToolBar.GetBarStyle();
if (dwStyle & CBRS_TOOLTIPS)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
41 在对象栏中添加组合框
在对象栏中添加组合框,应当起首调用CToolBar::SetButtonInfo函数,为组合框创建一个空白区域(TBBS_SEPARATOR), 然后调用CToolBar::GetItemRect函数,获得空白区域的大小和地位,最后调用CComboBox::Create函数,在空白区域创建组合框。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量
CComboBox m_ComboBox;
//在CMainFrame类中添加CreateComboBox成员函数
BOOL CMainFrame::CreateComboBox(UINT nID)
{
int nIndex = 0;
CRect rect;
//查找按钮
while (m_wndToolBar.GetItemID(nIndex) != nID)
{
nIndex++;
}
//为组合框创建一个空白区域
m_wndToolBar.SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, 80);
//获得空白区域大小和地位
m_wndToolBar.GetItemRect(nIndex, &rect);
//组合框大小和地位
rect.top += 0;
rect.bottom += 200;
//在空白区域创建组合框
if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL |
CBS_DROPDOWNLIST | CBS_HASSTRINGS, rect, &m_wndToolBar, nID))
{
TRACE0(Failed to create combo-box\n);
return FALSE;
}
//显示组合框
m_ComboBox.ShowWindow(SW_SHOW);
//在组合框中添加字符串
m_ComboBox.AddString(500%);
m_ComboBox.AddString(200%);
m_ComboBox.AddString(150%);
m_ComboBox.AddString(100%);
m_ComboBox.AddString(75%);
m_ComboBox.AddString(50%);
m_ComboBox.AddString(25%);
m_ComboBox.AddString(10%);
m_ComboBox.SetCurSel(3);
return TRUE;
}
//在CMainFrame类中添加WM_CREATE消息才处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//创建组合框
if (!CreateComboBox(ID_COMBOBOX))
{
TRACE0(Failed to create combo box\n);
return -1;
}
//...
return 0;
}
//在CMainFrame类中为组合框添加CBN_SELCHANGE消息处理惩罚函数
void CMainFrame::OnSelchangeCombobox()
{
CString strText = _T();
m_ComboBox.GetWindowText(strText);
AfxMessageBox(strText);
}
42 创建状况栏
创建状况栏,起首机关一个CStatusBar类对象,然后调用CStatusBar::Create函数创建状况栏窗口,最后调用CStatusBar::SetIndicators函数设置状况栏指导器。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量
protected:
CStatusBar m_wndDemoStatusBar;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建状况栏窗口
if (!m_wndDemoStatusBar.Create(this))
{
return -1;
}
//ID数组
UINT IDArray[2];
for (int n = 0; n < 2; n++)
{
IDArray[n] = 10000 + n;
}
//设置状况栏指导器
m_wndDemoStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
//设置窗格宽度
m_wndDemoStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 100);
m_wndDemoStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
//设置窗格文本
m_wndDemoStatusBar.SetPaneText(0, _T(状况栏:));
m_wndDemoStatusBar.SetPaneText(1, _T());
return 0;
}
43 在状况栏中添加进度条
在状况栏中添加进度条,应当起首调用CProgressCtrl::Create函数,创建进度条,然后调用CStatusBar::GetItemRect函数,获得指导器大小和地位,最后调用CWnd::MoveWindow函数移动进度条窗口。
//创建1个多文档的应用法度,添加1个基类为CStatusBar的类CProgressStatusBar
//在CProgressStatusBar类中添加成员变量
public:
CProgressCtrl m_Progress;
//在CProgressStatusBar类中添加WM_CREATE和WM_SIZE消息处理惩罚函数
int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatusBar::OnCreate(lpCreateStruct) == -1)
return -1;
//创建进度条
m_Progress.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0),
this, 1);
return 0;
}
void CProgressStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
//获得指导器大小和地位
CRect rect;
GetItemRect(0, &rect);
//移动进度条窗口
m_Progress.MoveWindow(rect.left + 1, rect.top, rect.Width() - 2, rect.Height());
}
//在CMainFrame类中添加成员变量
protected:
CProgressStatusBar m_wndProgressStatusBar;
//在CMainframe类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建状况栏窗口
if (!m_wndProgressStatusBar.Create(this))
{
return -1;
}
//ID数组
UINT IDArray[2];
for (int n = 0; n < 2; n++)
{
IDArray[n] = 10000 + n;
}
//设置状况栏指导器
m_wndProgressStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
//设置窗格宽度
m_wndProgressStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 200);
m_wndProgressStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
//设置窗格文本
m_wndProgressStatusBar.SetPaneText(0, _T());
m_wndProgressStatusBar.SetPaneText(1, _T());
//设置进度条
m_wndProgressStatusBar.m_Progress.SetRange(0, 100);
m_wndProgressStatusBar.m_Progress.SetStep(10);
m_wndProgressStatusBar.m_Progress.SetPos(50);
return 0;
}
44 显示或隐蔽对象栏和状况栏
显示或隐蔽对象栏和状况栏,可以调用CFrameWnd::ShowControlBar函数。
//创建1个多文档的应用法度,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资料中添加1个子菜单,在子菜单中添加2个菜单项(显示对象栏:ID_SHOW_TOOLBAR,显示状况栏:ID_SHOW_STATUSBAR)
void CMainFrame::OnShowToolbar()
{
if (m_wndToolBar.GetStyle() & WS_VISIBLE)
{
//隐蔽对象栏
ShowControlBar(&m_wndToolBar, FALSE, FALSE);
}
else
{
//显示对象栏
ShowControlBar(&m_wndToolBar, TRUE, FALSE);
}
}
void CMainFrame::OnUpdateShowToolbar(CCmdUI pCmdUI)
{
if (m_wndToolBar.GetStyle() & WS_VISIBLE)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
void CMainFrame::OnShowStatusbar()
{
if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
{
//隐蔽状况栏
ShowControlBar(&m_wndStatusBar, FALSE, FALSE);
}
else
{
//显示状况栏
ShowControlBar(&m_wndStatusBar, TRUE, FALSE);
}
}
void CMainFrame::OnUpdateShowStatusbar(CCmdUI pCmdUI)
{
if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
45 应用组合栏
起首调用 CReBar::Create 函数创建组合栏,然后调用 CReBar::AddBar 函数在组合栏中添加带区。
//在resource.h头文件中添加宏定义
#define IDC_COMBOBOX 1000
#define IDC_TEST 1001
//在CMainFrame类中添加成员变量
protected:
CReBar m_wndReBar;
CComboBox m_ComboBox;
CButton m_Button;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建组合框
if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL |
CBS_DROPDOWN, CRect(0, 0, 100, 200), this, IDC_COMBOBOX))
{
return FALSE;
}
//创建按钮
m_Button.Create(_T(断定), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(0, 0, 50, 20), this, IDC_TEST);
//创建Rebar
if (!m_wndReBar.Create(this))
{
return -1;
}
//添加对象栏、组合框、按钮添加到Rebar中
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_ComboBox, NULL, NULL,
RBBS_NOGRIPPER | RBBS_BREAK);
m_wndReBar.AddBar(&m_Button, NULL, NULL, RBBS_NOGRIPPER);
return 0;
}
//在CMainFrame类中为Button控件添加BN_CLICKED消息处理惩罚函数
void CMainFrame::OnTest()
{
CString strText = _T();
m_ComboBox.GetWindowText(strText);
if ((!strText.IsEmpty()) && (CB_ERR == m_ComboBox.FindString(-1, strText)))
{
m_ComboBox.AddString(strText);
}
AfxMessageBox(strText);
}
我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
Windows 应用法度的把握栏包含对象栏和状况栏等。在对象栏中可以添加按钮和控件,实现快捷操纵。在状况栏中可以显示一些提示信息。MFC 中,把握栏中的对象栏和状况栏分别经由过程 CToolBar 类和 CstatusBar 类实现,它们的父类都为 CContorlBar 类。
33 创建对象栏
创建对象栏,起建一个对象栏资料,然后机关一个 CToolBar 类对象,接下来调用 CToolBar::CreateEx 函数创建对象栏窗口,最后调用 CToolBar::LoadToolBar 函数加载对象栏资料。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
return 0;
}
34 设置对象栏题目
设置对象栏的题目可以调用CWnd::SetWindowText函数。
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//设置对象栏题目
CString strText = _T();
strText.LoadString(AFX_IDS_APP_TITLE);
m_wndToolBar.SetWindowText(strText);
//...
return 0;
}
35 停靠对象栏
停靠对象栏,起首调用CControlBar::EnableDocking函数和CFrameWnd::EnableDocking函数,然后调用CFrameWnd::DockControlBar函数。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
//在CMainFrame类中添加DockBar成员函数
void CMainFrame::DockBar(CControlBar pDestBar, CControlBar pSrcBar)
{
RecalcLayout(TRUE);
//获得对象栏窗口坐标
CRect rect;
pDestBar->GetWindowRect(&rect);
rect.OffsetRect(1, 0);
//获得对象栏风格
DWORD dwStyle = pDestBar->GetBarStyle();
UINT nDockBarID = 0;
if (dwStyle & CBRS_ALIGN_TOP)
{
nDockBarID = AFX_IDW_DOCKBAR_TOP;
}
else if (dwStyle & CBRS_ALIGN_BOTTOM)
{
nDockBarID = AFX_IDW_DOCKBAR_BOTTOM;
}
else if (dwStyle & CBRS_ALIGN_LEFT)
{
nDockBarID = AFX_IDW_DOCKBAR_LEFT;
}
else if (dwStyle & CBRS_ALIGN_RIGHT)
{
nDockBarID = AFX_IDW_DOCKBAR_RIGHT;
}
//停靠对象栏
DockControlBar(pSrcBar, nDockBarID, &rect);
}
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
return 0;
}
36 设置对象栏位图
设置对象栏的位图可以调用CToolBar::SetBitmap函数。
//创建1个多文档的应用法度,添加1个对象栏资料,ID为IDR_TOOLBAR,添加1个位图资料,ID为IDB_BITMAP1,在CMainFrame类中添加成员变量
public:
CToolBar m_wndDemoToolBar;
CBitmap m_Bitmap;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建对象栏窗口
if (!m_wndDemoToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
{
return -1;
}
//加载对象栏资料
if (!m_wndDemoToolBar.LoadToolBar(IDR_TOOLBAR))
{
return -1;
}
//停靠对象栏
m_wndDemoToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockBar(&m_wndToolBar,&m_wndDemoToolBar);
//设置位图
m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_wndDemoToolBar.SetBitmap((HBITMAP)m_Bitmap);
return 0;
}
37 为对象栏按钮添加文本标签
为对象栏按钮添加文本标签可以调用CToolBar::SetButtonText函数。
//创建1个多文档的应用法度,在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
for (int n = 0;n < m_wndToolBar.GetCount();n++)
{
//获得对象栏按钮ID
UINT nID = m_wndToolBar.GetItemID(n);
CString strText = _T();
if (!strText.LoadString(nID))
{
continue;
}
int nIndex = strText.Find(_T(\n));
if (nIndex < 0)
{
continue;
}
strText = strText.Right(strText.GetLength() - nIndex - 1);
//设置对象栏按钮文本
m_wndToolBar.SetButtonText(n,strText);
}
CRect rect;
m_wndToolBar.GetItemRect(0,&rect);
//设置对象栏按钮尺寸
m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
//...
return 0;
}
38 为对象栏按钮添加下拉箭头
为对象栏按钮添加下拉箭头,起首调用CToolBarCtrl::SetExtendedStyle函数,设置对象栏的TBSTYLE_EX_DRAWDDARROWS风格;然后调用CToolBar::SetButtonStyle函数,在每一个添加下拉箭头的按钮上设置TBSTYLE_DROPDOWN风格。
//创建1个多文档的应用法度,在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//设置对象栏扩大风格
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//设置对象栏按钮风格
int nIndex = m_wndToolBar.CommandToIndex(ID_FILE_NEW);
UINT nStyle = m_wndToolBar.GetButtonStyle(nIndex);
nStyle |= TBSTYLE_DROPDOWN;
m_wndToolBar.SetButtonStyle(nIndex, nStyle);
//...
return 0;
}
//在CMainFrame类中为对象栏添加TBN_DROPDOWN消息处理惩罚函数
//在MainFrame.h头文件中参加消息处理惩罚函数的声明:
afx_msg void OnDropDownToolBar(NMHDR pNMHDR, LRESULT pResult);
//在MainFrame.cpp中参加下拉箭头的TBN_DROPDOWN消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDownToolBar)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//TBN_DROPDOWN消息的实现:
void CMainFrame::OnDropDownToolBar(NMHDR pNMHDR, LRESULT pResult)
{
NMTOOLBAR pNMToolBar = (NMTOOLBAR)pNMHDR;
switch(pNMToolBar->iItem)
{
case ID_FILE_NEW:
::AfxMessageBox(_T(新建));
break;
default:
break;
}
}
39 为对象栏按钮设置热点图像
默认景象下,AppWizard应用对象栏资料来设置按钮的图像。对象栏资料包含一个复合的位图,该位图在调用CToolbar::LoadToolBar函数时将被转换成一个图像列表。
为对象栏按钮设置热点图像,应当起首调用CImageList::Create函数创建一个新的图像列表;然后调用CToolBarCtrl::SetHotImageList函数,将该图像列表设置为对象栏的热点图像列表。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量和WM_CREATE消息处理惩罚函数
private:
CImageList m_ImageList;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//创建图像列表
if (!m_ImageList.Create(IDB_BITMAP1,16,0,RGB(128,128,128)))
{
return -1;
}
//设置对象栏图像列表
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&m_ImageList);
//...
return 0;
}
40 启用或禁用对象栏的对象提示
启用和禁用对象栏的对象提示,可以经由过程调用CControlBar::SetBarStyle函数,添加或删除CBRS_TOOLTIPS风格实现。
//创建1个多文档的应用法度,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资料中添加1个子菜单,在子菜单中添加1个菜单项(ID:ID_ENABLE_TOOLTIPS)
//在CMainFrame类中为菜单项添加号令处理惩罚函数
void CMainFrame::OnEnableTooltips()
{
//获得对象栏风格
DWORD dwStyle = m_wndToolBar.GetBarStyle();
//启用或禁用对象提示
if (dwStyle & CBRS_TOOLTIPS)
{
dwStyle &= ~CBRS_TOOLTIPS;
}
else
{
dwStyle |= CBRS_TOOLTIPS;
}
//设置对象栏风格
m_wndToolBar.SetBarStyle(dwStyle);
}
void CMainFrame::OnUpdateEnableTooltips(CCmdUI pCmdUI)
{
//获得对象栏风格
DWORD dwStyle = m_wndToolBar.GetBarStyle();
if (dwStyle & CBRS_TOOLTIPS)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
41 在对象栏中添加组合框
在对象栏中添加组合框,应当起首调用CToolBar::SetButtonInfo函数,为组合框创建一个空白区域(TBBS_SEPARATOR), 然后调用CToolBar::GetItemRect函数,获得空白区域的大小和地位,最后调用CComboBox::Create函数,在空白区域创建组合框。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量
CComboBox m_ComboBox;
//在CMainFrame类中添加CreateComboBox成员函数
BOOL CMainFrame::CreateComboBox(UINT nID)
{
int nIndex = 0;
CRect rect;
//查找按钮
while (m_wndToolBar.GetItemID(nIndex) != nID)
{
nIndex++;
}
//为组合框创建一个空白区域
m_wndToolBar.SetButtonInfo(nIndex, nID, TBBS_SEPARATOR, 80);
//获得空白区域大小和地位
m_wndToolBar.GetItemRect(nIndex, &rect);
//组合框大小和地位
rect.top += 0;
rect.bottom += 200;
//在空白区域创建组合框
if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL |
CBS_DROPDOWNLIST | CBS_HASSTRINGS, rect, &m_wndToolBar, nID))
{
TRACE0(Failed to create combo-box\n);
return FALSE;
}
//显示组合框
m_ComboBox.ShowWindow(SW_SHOW);
//在组合框中添加字符串
m_ComboBox.AddString(500%);
m_ComboBox.AddString(200%);
m_ComboBox.AddString(150%);
m_ComboBox.AddString(100%);
m_ComboBox.AddString(75%);
m_ComboBox.AddString(50%);
m_ComboBox.AddString(25%);
m_ComboBox.AddString(10%);
m_ComboBox.SetCurSel(3);
return TRUE;
}
//在CMainFrame类中添加WM_CREATE消息才处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::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(Failed to create toolbar\n);
return -1; // fail to create
}
//创建组合框
if (!CreateComboBox(ID_COMBOBOX))
{
TRACE0(Failed to create combo box\n);
return -1;
}
//...
return 0;
}
//在CMainFrame类中为组合框添加CBN_SELCHANGE消息处理惩罚函数
void CMainFrame::OnSelchangeCombobox()
{
CString strText = _T();
m_ComboBox.GetWindowText(strText);
AfxMessageBox(strText);
}
42 创建状况栏
创建状况栏,起首机关一个CStatusBar类对象,然后调用CStatusBar::Create函数创建状况栏窗口,最后调用CStatusBar::SetIndicators函数设置状况栏指导器。
//创建1个多文档的应用法度,在CMainFrame类中添加成员变量
protected:
CStatusBar m_wndDemoStatusBar;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建状况栏窗口
if (!m_wndDemoStatusBar.Create(this))
{
return -1;
}
//ID数组
UINT IDArray[2];
for (int n = 0; n < 2; n++)
{
IDArray[n] = 10000 + n;
}
//设置状况栏指导器
m_wndDemoStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
//设置窗格宽度
m_wndDemoStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 100);
m_wndDemoStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
//设置窗格文本
m_wndDemoStatusBar.SetPaneText(0, _T(状况栏:));
m_wndDemoStatusBar.SetPaneText(1, _T());
return 0;
}
43 在状况栏中添加进度条
在状况栏中添加进度条,应当起首调用CProgressCtrl::Create函数,创建进度条,然后调用CStatusBar::GetItemRect函数,获得指导器大小和地位,最后调用CWnd::MoveWindow函数移动进度条窗口。
//创建1个多文档的应用法度,添加1个基类为CStatusBar的类CProgressStatusBar
//在CProgressStatusBar类中添加成员变量
public:
CProgressCtrl m_Progress;
//在CProgressStatusBar类中添加WM_CREATE和WM_SIZE消息处理惩罚函数
int CProgressStatusBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CStatusBar::OnCreate(lpCreateStruct) == -1)
return -1;
//创建进度条
m_Progress.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0),
this, 1);
return 0;
}
void CProgressStatusBar::OnSize(UINT nType, int cx, int cy)
{
CStatusBar::OnSize(nType, cx, cy);
//获得指导器大小和地位
CRect rect;
GetItemRect(0, &rect);
//移动进度条窗口
m_Progress.MoveWindow(rect.left + 1, rect.top, rect.Width() - 2, rect.Height());
}
//在CMainFrame类中添加成员变量
protected:
CProgressStatusBar m_wndProgressStatusBar;
//在CMainframe类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建状况栏窗口
if (!m_wndProgressStatusBar.Create(this))
{
return -1;
}
//ID数组
UINT IDArray[2];
for (int n = 0; n < 2; n++)
{
IDArray[n] = 10000 + n;
}
//设置状况栏指导器
m_wndProgressStatusBar.SetIndicators(IDArray, sizeof(IDArray) / sizeof(UINT));
//设置窗格宽度
m_wndProgressStatusBar.SetPaneInfo(0, IDArray[0], SBPS_NORMAL, 200);
m_wndProgressStatusBar.SetPaneInfo(1, IDArray[1], SBPS_STRETCH, 0);
//设置窗格文本
m_wndProgressStatusBar.SetPaneText(0, _T());
m_wndProgressStatusBar.SetPaneText(1, _T());
//设置进度条
m_wndProgressStatusBar.m_Progress.SetRange(0, 100);
m_wndProgressStatusBar.m_Progress.SetStep(10);
m_wndProgressStatusBar.m_Progress.SetPos(50);
return 0;
}
44 显示或隐蔽对象栏和状况栏
显示或隐蔽对象栏和状况栏,可以调用CFrameWnd::ShowControlBar函数。
//创建1个多文档的应用法度,分别在IDR_MAINFRAME和IDR_DEMOTYPE菜单资料中添加1个子菜单,在子菜单中添加2个菜单项(显示对象栏:ID_SHOW_TOOLBAR,显示状况栏:ID_SHOW_STATUSBAR)
void CMainFrame::OnShowToolbar()
{
if (m_wndToolBar.GetStyle() & WS_VISIBLE)
{
//隐蔽对象栏
ShowControlBar(&m_wndToolBar, FALSE, FALSE);
}
else
{
//显示对象栏
ShowControlBar(&m_wndToolBar, TRUE, FALSE);
}
}
void CMainFrame::OnUpdateShowToolbar(CCmdUI pCmdUI)
{
if (m_wndToolBar.GetStyle() & WS_VISIBLE)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
void CMainFrame::OnShowStatusbar()
{
if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
{
//隐蔽状况栏
ShowControlBar(&m_wndStatusBar, FALSE, FALSE);
}
else
{
//显示状况栏
ShowControlBar(&m_wndStatusBar, TRUE, FALSE);
}
}
void CMainFrame::OnUpdateShowStatusbar(CCmdUI pCmdUI)
{
if (m_wndStatusBar.GetStyle() & WS_VISIBLE)
{
pCmdUI->SetCheck(TRUE);
}
else
{
pCmdUI->SetCheck(FALSE);
}
}
45 应用组合栏
起首调用 CReBar::Create 函数创建组合栏,然后调用 CReBar::AddBar 函数在组合栏中添加带区。
//在resource.h头文件中添加宏定义
#define IDC_COMBOBOX 1000
#define IDC_TEST 1001
//在CMainFrame类中添加成员变量
protected:
CReBar m_wndReBar;
CComboBox m_ComboBox;
CButton m_Button;
//在CMainFrame类中添加WM_CREATE消息处理惩罚函数
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//...
//创建组合框
if (!m_ComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL |
CBS_DROPDOWN, CRect(0, 0, 100, 200), this, IDC_COMBOBOX))
{
return FALSE;
}
//创建按钮
m_Button.Create(_T(断定), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(0, 0, 50, 20), this, IDC_TEST);
//创建Rebar
if (!m_wndReBar.Create(this))
{
return -1;
}
//添加对象栏、组合框、按钮添加到Rebar中
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_ComboBox, NULL, NULL,
RBBS_NOGRIPPER | RBBS_BREAK);
m_wndReBar.AddBar(&m_Button, NULL, NULL, RBBS_NOGRIPPER);
return 0;
}
//在CMainFrame类中为Button控件添加BN_CLICKED消息处理惩罚函数
void CMainFrame::OnTest()
{
CString strText = _T();
m_ComboBox.GetWindowText(strText);
if ((!strText.IsEmpty()) && (CB_ERR == m_ComboBox.FindString(-1, strText)))
{
m_ComboBox.AddString(strText);
}
AfxMessageBox(strText);
}
我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》