CToolBar m_wndTool;
//創建控件
m_wndTool.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_NOPREFIX, WS_CHILD | WS_VISIBLE | CBRS_FLYBY | CBRS_TOP | CBRS_SIZE_DYNAMIC);
//加載工具欄資源
m_wndTool.LoadToolBar(IDR_TOOL_LOAD) //在.rc中定義:IDR_TOOL_LOAD BITMAP "res\\tool_load.bmp"//工具欄中單個按鈕的樣式、大小
CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);//設置按鈕文字
SetButtonText();//設置樣式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));
DWORD olddwStyle = dwStyle;
DWORD tempStyle = dwStyle;
tempStyle |= TBSTYLE_CHECK; //支持復選框行為。常用于選中狀態切換,如點擊后保持按下(選中)狀態,再次點擊時恢復原狀。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);//刪除控件
m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR_3));//隱藏控件
m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR_4, TRUE);//顯示工具欄控件
m_wndTool.ShowWindow(SW_SHOW);
//重新定位和調整工具欄和其他控件欄的大小
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
創建控件CToolBar::CreateEx()
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);
CWnd* pParentWnd
:父窗口的指針。
DWORD dwCtrlStyle
:工具欄控件的樣式。
DWORD dwStyle
:窗口的擴展樣式。這些樣式來自Windows SDK,定義了窗口的行為和外觀。
CRect rcBorders
:工具欄邊框的尺寸。
UINT nID
:工具欄的ID。AFX_IDW_TOOLBAR
是MFC預定義的一個ID,用于默認的工具欄。
CToolBar 類
工具欄控件和按鈕樣式
加載工具欄資源
1.在資源文件中增加Toolbar資源文件
2.在.rc文件中定義資源路徑映射
IDR_TOOL_1 BITMAP "res\\tool_1.bmp"
3.加載資源
m_wndTool.LoadToolBar(IDR_TOOL_LOAD)
設置按鈕大小
CSize bSize;
bSize.cx = 80;
bSize.cy = 32;
m_wndTool.GetToolBarCtrl().SetButtonSize(bSize);
m_wndTool.GetToolBarCtrl().SetBitmapSize(bSize);
獲取按鈕個數GetButtonCount()
int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();
設置、獲取按鈕信息GetButtonInfo()
//設置。TBBS_BUTTON:標準按鍵
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_1, TBBS_BUTTON, 0);//獲取
UINT nID, nStyle;
int nImage;
m_wndTool.GetButtonInfo(i, nID, nStyle, nImage);
按鈕類型
工具欄控件樣式
設置按鈕文字
/**加載語言文件**/
int nCount = m_wndTool.GetToolBarCtrl().GetButtonCount();
UINT nID, nStyle;
int nImage;
for (int i = 0; i < nCount; i++)
{m_wndTool.GetButtonInfo(i, nID, nStyle, nImage); //獲取按鈕信息nID,用于關聯語言文件sLoader = tr(nID); //從語言文件加載m_wndTool.SetButtonText(i, sLoader);
}
/**繪制文字到按鈕上**/
CImageList* cImageList = NULL;
cImageList = m_ImgList;CBitmap cBitmap;
BITMAP bmBitmap;
if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_TOOL_1), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) ||!cBitmap.GetBitmap(&bmBitmap)) //附加圖片資源return FALSE;//按鈕圖片上輸出文本
CDC memDc;
CDC* pDC = GetDC();
memDc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap;
pOldBitmap = memDc.SelectObject(&cBitmap);
memDc.SetBkMode(TRANSPARENT);
memDc.SetTextColor(RGB(0,0,0));CRect rcButton(0, 32, 0, 32 + nBtnWidth);
int nCount = GetToolBarCtrl().GetButtonCount();
int i;
CString sText;
UINT nID, nStyle;;
int nImage;
for ( i = 0; i < nCount; i++)
{GetButtonInfo(i, nID, nStyle, nImage);GetButtonText(i, sText);rcButton.left = i*nBtnWidth;rcButton.right = (i+1)*nBtnWidth;memDc.DrawText(sText, rcButton, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
memDc.SelectObject(pOldBitmap);
memDc.DeleteDC();
ReleaseDC(pDC);BOOL bFlag = FALSE;
if ( cImageList )
{cImageList->DeleteImageList();delete cImageList;bFlag = TRUE;
}
//按鈕圖片上輸出文本
CSize cSize(bmBitmap.bmWidth, bmBitmap.bmHeight);
int nNbBtn = cSize.cx/nBtnWidth;
RGBTRIPLE* rgb = (RGBTRIPLE*)(bmBitmap.bmBits);
COLORREF rgbMask = RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue);
cImageList = new CImageList;
m_ImgList = cImageList;
if (!cImageList->Create(nBtnWidth, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 0)) //創建多個圖標區return FALSE;if (cImageList->Add(&cBitmap, rgbMask) == -1) //將位圖分割為多個圖標并添加到圖像return FALSE;
SendMessage(TB_SETIMAGELIST, 0, (LPARAM)cImageList->m_hImageList); //向工具欄控件發送消息,設置新的圖像列表。
cBitmap.DeleteObject();
cBitmap.Detach();
cImageList->Add(&cBitmap, rgbMask)
:圖像列表會根據初始化時指定的圖標尺寸(nBtnWidth x cSize.cy),?從左到右依次切割位圖,每個子區域作為一個圖標添加到列表中。
工具欄用途
TB_SETIMAGELIST
:設置工具欄用于顯示處于默認狀態的按鈕的圖像列表。
TB_SETHOTIMAGELIST
:設置工具欄控件將用于顯示熱按鈕的圖像列表
TB_SETDISABLEDIMAGELIST
:設置工具欄控件將用于顯示禁用的按鈕的圖像列表。
TB_SETIMAGELIST 消息
按鈕樣式設置
//獲取按鈕樣式
DWORD dwStyle = m_wndTool.GetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_1));//設置按鈕樣式
DWORD olddwStyle = dwStyle;
DWORD tempStyle = dwStyle;
tempStyle |= TBSTYLE_CHECK; //支持復選框行為。常用于選中狀態切換,如點擊后保持按下(選中)狀態,再次點擊時恢復原狀。
m_wndTool.SetButtonStyle(m_wndTool.CommandToIndex(IDS_TOOLBAR_2), dwStyle);
RepositionBars()
重新定位和調整工具欄和其他控件欄的大小。
RepositionBars的用法和參數的意義
MFC狀態欄之RepositionBars
隱藏控件
m_wndTool.GetToolBarCtrl().HideButton(IDS_TOOLBAR, TRUE);
禁用控件
m_wndTool.GetToolBarCtrl().EnableButton(IDS_TOOLBAR, FALSE);
刪除控件
m_wndTool.GetToolBarCtrl().DeleteButton(m_wndTool.CommandToIndex(IDS_TOOLBAR));
設置按鈕狀態
DWORD dwState = m_wndTool.GetToolBarCtrl().GetState(IDS_TOOLBAR_1);
m_wndTool.GetToolBarCtrl().SetState(IDS_TOOLBAR_2, dwState);
綁定按鈕的點擊事件
m_wndTool.SetButtons(NULL, 3); //設置按鈕數量
m_wndTool.SetButtonInfo(0, IDS_TOOLBAR_0, TBBS_BUTTON, 0);
m_wndTool.SetButtonInfo(1, IDS_TOOLBAR_1, TBBS_BUTTON, 1);
m_wndTool.SetButtonInfo(2, IDS_TOOLBAR_2, TBBS_BUTTON, 2);
m_wndTool.Invalidate(); //強制刷新
MFC 工具欄實現