一、創建普通toolbar
1. 新建一MFC程序,在Dlg頭文件中添加一個CToolBar類的成員變量CToolBar m_Toolbar;
2. 然後在頭文件中定義工具欄命令ID。
#define ID_BUTTON1 501
#define ID_BUTTON2 502
#define ID_BUTTON3 503
3. 在資源對話框中,新建一toolbar.然後創建3個按鈕。
注意:在VS 2008中添加按鈕操作是對當前按鈕的ID屬性賦值,系統會自動出現一個新的按鈕。
4. 修改按鈕的ID分別爲ID_BUTTON1、ID_BUTTON2、ID_BUTTON3,也可以修改按鈕的大小,用畫筆工具修改按鈕的樣子。
5. 然後就可以初始化toolbar了:
m_Toolbar.Create(this);//創建工具欄控件
m_Toolbar.LoadToolBar(IDR_TOOLBAR1);//裝載工具欄資源
//該函數用於顯示工具欄,並根據窗口大小自動調整工具欄的位置
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
6. 添加按鈕的相應事件:
首先在頭文件中聲明事件處理函數:
afx_msg void Button1Click();
在.cpp文件中聲明COMMAND 事件的消息函數映射:ON_COMMAND(ID_BUTTON1,CToolbarNewDlg::Button1Click)
在.cpp中實現Button1Click函數即可。
二、創建真彩色toolbar
1.首先向工程中導入6張位圖(格式爲bmp),大小爲32*32,顏色爲32位。ID分別默認爲IDB_BITMAP1, IDB_BITMAP2……
2.在Dlg頭文件中添加兩個變量:
CToolBar m_Toolbar;
CImageList m_ImageList;
3.在頭文件中添加宏定義:
#define ID_BUTTON1 501
#define ID_BUTTON2 502
#define ID_BUTTON3 503
#define ID_BUTTON4 504
#define ID_BUTTON5 505
#define ID_BUTTON6 506
4.添加初始化代碼:
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,1,1);
//圖片大小必須一致,參數分別表示圖片的像素32*32,32位真彩色。
CBitmap bmp;
for(int i=0;i<6;i++)
{
//使用現有位圖爲bmp賦值
bmp.LoadBitmap(IDB_BITMAP1+i);
m_ImageList.Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();
}
UINT nArray[6];
for(i=0;i<6;i++)
{
nArray[i]=ID_BUTTON1+i;
}
m_Toolbar.CreateEx(this);
//創建工具欄控件,CreateEx函數創建的工具欄,默認有浮動按鈕屬性
m_Toolbar.SetButtons(nArray,6);
//創建六個工具按鈕,並依次設置ID號,對應nArray數組的元素
//相當於完成了一中手動爲按鈕設置ID的工作。
m_Toolbar.SetSizes(CSize(40,40),CSize(32,32));
//函數第一個是按鈕大小,第二個是圖像大小,按鈕必須比圖像要大,具體是按鈕的要比圖像的寬大7或者以上,高6
m_Toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);//設置圖像
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
顯示效果:
三、爲toolbar添加背景位圖
1. MFC提供了一個類CReBar,這是一個容器類,可以向這個類中添加工具欄,編輯框,下拉列表等等。在頭文件中添加一個CReBar類的變量:CReBar m_Rebar;
2.導入一張位圖,作爲工具欄背景,ID爲ID_TOOLBACK.
3.在上邊代碼中RepositionBars語句之前添加如下代碼:
m_Rebar.Create(this);//創建窗口(控件)
m_Rebar.AddBar(&m_Toolbar);//將m_Toolbar綁定到CReBar上
m_Rebar.RedrawWindow();//重畫窗口
REBARBANDINFO info;//設置CReBar的樣式
info.cbSize=sizeof(info);
info.fMask=RBBIM_BACKGROUND;
m_Toolbar.ModifyStyle(0,TBSTYLE_TRANSPARENT);
//設置工具欄背景色透明,以便顯示CReBar的底色
info.hbmBack=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_TOOLBACK));
//加載位圖
m_Rebar.GetReBarCtrl().SetBandInfo(0,&info);
4.如果要爲button設置文字的話,可以使用CToolBar類的SetButtonText函數,但是此函數必須放在setSize函數之前,否則無法顯示文字;而且要設置toolbar的高度足夠,以便顯示文字。
5.運行效果如下:
6.問題:
我按上述方法進行操作後,CReBar已經創建,但是背景色不知道爲何添加不上。如果有誰解決了此問題,望不吝賜教。
四、添加鼠標停留事件
1.首先在頭文件中添加一字符串變量:CString str;
2.在m_Toolbar調用CreateEX函數後,添加語句:
m_Toolbar.EnableToolTips();//激活信息提醒功能
3.在頭文件中添加TTN_NEEDTEXT消息處理函數:
BOOL OnDisplay(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
4.在.cpp中添加消息映射宏:
ON_NOTIFY_EX(TTN_NEEDTEXT,0,CToolbarNewDlg::OnDisplay)
5.實現OnDisplay代碼:
TOOLTIPTEXT *pTTT=(TOOLTIPTEXT *)pNMHDR;
UINT nID=pNMHDR->idFrom;//獲取工具欄按鈕ID
UINT nIndex=m_Toolbar.CommandToIndex(nID);//根據按鈕ID獲取索引
switch(nID)
{
case ID_BUTTON1: str="旅行社";break;
case ID_BUTTON2: str="賓館";break;
case ID_BUTTON3: str="招聘";break;
default : str="";
}
pTTT->lpszText=str.GetBuffer(str.GetLength());//設置按鈕提示信息
pTTT->hinst=AfxGetResourceHandle();
return TRUE;
五、使用ICON構建toolbar
1.與用bmp圖像構建toolbar一樣,只是向m_ImageList中添加圖片的方式有些不同:
for(int i=IDI_ICON1;i<=IDI_ICON6;i++)
m_ImageList.Add(AfxGetApp()->LoadIcon(i));//添加圖標
六、設置toolbar熱點圖標
1.準備兩套圖標,一套爲正常顯示,一套爲鼠標放上去後熱點顯示的圖標。
2.工具欄必須具有TBSTYLE_FLAT(浮動按鈕)屬性,這在創建時已經默認擁有。
3.在頭文件中額外定義ImageList:CmageList m_hotImageList;
4.以下語句添加在與_ImageList創建過程相應的位置即可:
m_hotImageList.Create(48,48,ILC_COLOR24|ILC_MASK,1,1);
m_hotImageList.Add(AfxGetApp()->LoadIcon(IDI_HOT1+i));
m_toolbar.GetToolBarCtrl().SetHotImageList(&m_hotImageList);
5.這樣,當鼠標放上去時,就會顯示另一種樣子。
七、CToolBarCtrl工具欄控制類
1.用法跟CToolBar相似:
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
dwStyle:工具欄控件的風格
rect:工具欄位置和區域
pParentWnd:工具欄父窗口句柄(屬於哪個窗口)
nID:工具欄控件ID號
AddButtons用於往工具欄添加一組按鈕:
BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );
nNumButtons:要添加的按鈕數量 也就是函數第二個參數數組大小。
lpButtons:一個TBBUTTON結構數組的地址
TBBUTON結構定義如下:
typedef struct _TBBUTTON
{
int iBitmap;
// 按鈕顯示的圖片索引,沒有圖像爲NULL,
int idCommand;
// 與此按鈕相關聯的命令標識符,fsStyle具有TBSTYLE_SEP屬性時,該項必須爲0
BYTE fsState; // 按鈕的狀態標誌
BYTE fsStyle; //按鈕風格
DWORD dwData; // 用戶定義的數據
int iString; // 按鈕顯示的文本內容索引,無爲NULL。
} TBBUTTON;
2.使用CToolBarCtrl添加一個工具條的過程:
CImageList m_ImageList;
CToolBarCtrl m_TBarCtrl;
TBBUTTON button[4];
m_ImageList.Create(32,32,ILC_COLOR32|ILC_MASK,0,0);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON4));
m_TBarCtrl.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,1200);
m_TBarCtrl.SetImageList(&m_ImageList);
for(int i=0;i<4;i++)
{
button[i].fsState=TBSTATE_ENABLED;
button[i].fsStyle=TBSTYLE_BUTTON;
button[i].iBitmap=i;
}
m_TBarCtrl.AddButtons(4,button);
m_TBarCtrl.AutoSize();
m_TBarCtrl.SetStyle(TBSTYLE_FLAT|CCS_TOP);
3.爲按鈕創建響應事件函數
TBBUTON結構裏有一個成員idCommand,這個成員跟菜單項的ID值一樣,用於標識工具欄按鈕項,也就是說idCommand是工具欄項ID號,就是最前面設置工具欄資源時,選擇一個按鈕,然後按回車,彈出一個對話框,裏面有一個ID項,跟這個是一樣的。
在上邊的for循環中,添加button[i].idCommand=ID_BUTTON1+i;爲按鈕設置ID
然後添加COMMAND事件函數即可。