VC并不提供工具栏控件,而是通过CToolBar类来创建工具栏。
动态创建工具栏的操作如下:
通过资源窗口导入工具栏按钮的ico文件。
在App的头文件(如CDemoDlg.h)里,添加如下定义
#defineTB_BUTTON_CNTMAX 5 //工具栏按钮个数
#defineTB_BUTTON_WIDTH 32 //工具栏按钮图标宽度
#defineTB_BUTTON_HIGHT 32 //工具栏按钮图标高度
添加成员变量并声明提示信息的消息处理函数OnDisplay
CToolBar m_objToolBar;
CImageList m_TBImageList;
CString m_sHint;
BOOL OnDisplay(UINT id, NMHDR*pNMHDR, LRESULT *pResult); //显示提示信息
DECLARE_MESSAGE_MAP()
在APP的源文件(如CDemoDlg.c)的OnInitDialog()函数最后添加如下代码,将m_TBImageList与工具栏m_objToolBar关联,并将工具栏和对应菜单项ID进行关联,从而与菜单项共用处理函数
BOOLCDemoDlg ::OnInitDialog(){
//创建m_TBImageList
m_TBImageList.Create(TB_BUTTON_WIDTH,TB_BUTTON_HIGHT, ILC_COLOR32 | ILC_MASK, 1, 1);
m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON1));
m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON2));
m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON3));
m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON4));
m_TBImageList.Add(AfxGetApp()->LoadIcon(ID_TB_ICON5));
//创建m_objToolBar
m_objToolBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER
| CBRS_TOOLTIPS | CBRS_SIZE_DYNAMIC| CBRS_BORDER_TOP);
//将TBImageList设置给m_objToolBar
m_objToolBar.GetToolBarCtrl().SetImageList(&m_TBImageList);
//工具栏按钮设置
TBBUTTON tbButton[TB_BUTTON_CNTMAX]= {0};
for(inti=0; i< TB_BUTTON_CNTMAX; i++)
{
if(i == 1 || i == 3)
{
tbButton[i].dwData = NULL;
tbButton[i].fsState = TBSTATE_ENABLED;
tbButton[i].fsStyle = (BYTE)TBSTYLE_SEP; //设为分割条
tbButton[i].iBitmap = i;
}
else
{
tbButton[i].dwData = NULL;
tbButton[i].fsState = TBSTATE_ENABLED;
tbButton[i].fsStyle = (BYTE)TBSTYLE_FLAT;
tbButton[i].iBitmap = i;
}
}
}
//绑定菜单项
tbButton[0].idCommand = ID_MENU_0_0;
tbButton[1].idCommand =ID_MENU_0_1;
tbButton[2].idCommand = ID_MENU_0_2;
tbButton[3].idCommand =ID_MENU_0_3;
tbButton[4].idCommand = ID_MENU_0_4;
m_objToolBar.GetToolBarCtrl().AddButtons(TB_BUTTON_CNTMAX, tbButton);
//设定按钮及按钮图片大小
m_objToolBar.SetSizes(CSize(40,40), CSize(TB_BUTTON_WIDTH,TB_BUTTON_HIGHT));
//使工具栏根据窗口大小自动调整工具栏的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
//显示提示信息
m_objToolBar.EnableToolTips();
}
//提示信息需要在消息映射中添加如下处理
BEGIN_MESSAGE_MAP(CDemoDlg, CDialogEx)
ON_NOTIFY_EX(TTN_NEEDTEXT,0, & CDemoDlg::OnDisplay)
END_MESSAGE_MAP()
BOOL CJWEODocDialog::OnDisplay(UINTid, NMHDR *pNMHDR, LRESULT *pResult)
{
TOOLTIPTEXT *pTBT=(TOOLTIPTEXT*)pNMHDR;
UINT nID =pNMHDR->idFrom; //获取工具栏按钮ID
UINT nIndex = m_objToolBar.CommandToIndex(nID); //根据按钮ID获取索引
switch(nIndex)
{
case0:
m_sHint= "打开";
break;
case2:
m_sHint= "套红头";
break;
case4:
m_sHint= "公文盖章";
break;
default:
m_sHint= "";
break;
}
pTBT ->lpszText= m_sHint.GetBuffer(m_sHint.GetLength()); //设置按钮提示信息
pTBT ->hinst= AfxGetResourceHandle();
returnTRUE;
}
想控制工具栏按钮置灰,可添加UpdateToolBarStatus(),并在头文件CDemoDlg.h中添加声明
CDemoDlg.h
void UpdateToolBarStatus()
CDemoDlg.c
voidCDemoDlg::UpdateToolBarStatus()
{
m_objToolBar.GetToolBarCtrl().SetState(ID_MENU_0_0, TBSTATE_ENABLED);
}
可通过ShowWindow设置工具栏的显示隐藏
::ShowWindow(m_objToolBar.m_hWnd, SW_HIDE);
::ShowWindow(m_objToolBar.m_hWnd, SW_SHOWNORMAL);
后记:
通过工具栏按钮的结构体,可以对每一个工具栏按钮进行设置,结构体如下:
typedefstruct_TBBUTTON {
intiBitmap;
intidCommand;
BYTE fsState;
BYTE fsStyle;
#ifdef _WIN64
BYTEbReserved[6]; //padding for alignment
#elifdefined(_WIN32)
BYTE bReserved[2]; // padding for alignment
#endif
DWORD_PTR dwData;
INT_PTR iString;
} TBBUTTON, NEAR* PTBBUTTON, *LPTBBUTTON;
idCommand:与此按钮相关联的命令标识符,当fsStyle具有TBSTYLE_SEP属性时,该项必须为0
fsState: 按钮的状态标志。它可以是下面列出的值的一个组合:
· TBSTATE_CHECKED 该按钮具有TBSTYLE_CHECKED风格并且被按下。
· TBSTATE_ENABLED 按钮接收用户输入。一个不具有这个状态的按钮是不接收用户输入的,并且变灰。
· TBSTATE_HIDDEN 按钮不可见,并且不能接收用户输入。
· TBSTATE_INDETERMINATE 按钮是变灰的。
· TBSTATE_PRESSED 按钮被按下。
· TBSTATE_WRAP 按钮之后是一个分隔线。此按钮还必须具有TBSTATE_ENABLED状态。
sStyle 按钮风格。它可以是下列值的一个组合:
· TBSTYLE_BUTTON 创建一个标准的按钮。
· TBSTYLE_CHECK 创建一个每次用户点击时可以在按下和弹起状态间切换的按钮。该按钮则处于按下状态时有一种不同的背景颜色。
· TBSTYLE_CHECKGROUP 创建一个核选按钮,它被选择后一直处于按下状态,直到同组中的另一个按钮被按下时它才弹起。
· TBSTYLE_GROUP 创建一个被选择后一直处于按下状态,直到同组中的另一个按钮被按下时它才弹起的按钮。
· TBSTYLE_SEP 创建一个分隔线,为按钮组之间提供一个小的间距。具有这个风格的按钮是不接收用户输入的
CToolBar类的主要成员函数
virtual 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
);
pParentWnd为工具栏父窗口的指针。
dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。
dwStyle为工具栏的风格,默认为WS_CHILD| WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部,各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。
nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。