CMFCToolBar是vs08sp1以后引入的新的工具欄控件,和Ribbon主題結(jié)合的很好,不同與CToolBar,它是從CPane派生出來的,用法跟CToolbar 有一些不同,研究了幾天,記錄在下面。
首先給出工具欄四種狀態(tài)圖標(biāo)BMP文件,這4個文件分別為圖標(biāo)按鈕的Cold、Hot、Disabled、Enabled狀態(tài),資源是從VS的MSMoney這個Demo里考出來的,每個按鈕大小時46*46。效果見下圖,這里給出本站下載資源。新建一個空白SDI文檔,選用Ribbon主題。找到資源工具欄-Toobar上右鍵新建一個toolbar,取名IDR_MYTOOLBAR,在右側(cè)的編輯欄里將新建出來的工具欄第一個圖標(biāo)的屬性-Height和width改為46*46,此時圖標(biāo)會變大。見下圖。用鉛筆工具在這個圖標(biāo)上隨便畫個東西,完成時,它的右側(cè)會多一個圖標(biāo),繼續(xù)畫,一直第6個圖標(biāo)(此時會有第7個出來,不用畫了)。導(dǎo)入下載的四個bmp文件到資源里,如下圖,ID分別取好。用類向?qū)腃MFCToolBar里派生一個新類,或者直接拷貝下面的代碼到Mainfrm.h文件里 [cpp] view plain copy print? class?CMYToolBar?:?public?CMFCToolBar??{??public:???????DECLARE_DYNCREATE(CMYToolBar)??????????public:??????CMYToolBar();????????virtual?~CMYToolBar?();??public:??????virtual?BOOL?LoadToolBar?(UINT?uiResID,?UINT?uiColdResID?=?0,???????????UINT?uiMenuResID?=?0,?BOOL?bLocked?=?FALSE,??????????UINT?uiDisabledResID?=?0,?UINT?uiMenuDisabledResID?=?0,??????????UINT?uiHotResID?=?0);????protected:??????afx_msg?int?OnCreate(LPCREATESTRUCT?lpCreateStruct);??????DECLARE_MESSAGE_MAP()????????virtual?BOOL?DrawButton?(CDC*?pDC,?CMFCToolBarButton*?pButton,???????????CMFCToolBarImages*?pImages,?BOOL?bHighlighted,??????????BOOL?bDrawDisabledImages);????};?? class CMYToolBar : public CMFCToolBar
{
public: DECLARE_DYNCREATE(CMYToolBar)// Construction
public:CMYToolBar();virtual ~CMYToolBar ();
public:virtual BOOL LoadToolBar (UINT uiResID, UINT uiColdResID = 0, UINT uiMenuResID = 0, BOOL bLocked = FALSE,UINT uiDisabledResID = 0, UINT uiMenuDisabledResID = 0,UINT uiHotResID = 0);protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);DECLARE_MESSAGE_MAP()virtual BOOL DrawButton (CDC* pDC, CMFCToolBarButton* pButton, CMFCToolBarImages* pImages, BOOL bHighlighted,BOOL bDrawDisabledImages);};mainfrm類里添加控件變量
[cpp] view plain
copy print?
CMYToolBar??????????m_wndMyToolBar;?? CMYToolBar m_wndMyToolBar;
mainfrm.cpp添加類實現(xiàn)代碼 [cpp] view plain copy print? IMPLEMENT_DYNCREATE(CMYToolBar,?CMFCToolBar)????CMYToolBar::CMYToolBar()??{??}??????CMYToolBar::~CMYToolBar()??{??}??????BEGIN_MESSAGE_MAP(CMYToolBar,?CMFCToolBar)??????ON_WM_CREATE()????????END_MESSAGE_MAP()??????????int?CMYToolBar::OnCreate(LPCREATESTRUCT?lpCreateStruct)???{??????if?(CMFCToolBar::OnCreate(lpCreateStruct)?==?-1)??????????return?-1;????????SetPaneStyle(CBRS_GRIPPER?|?CBRS_BORDER_TOP?|?CBRS_BORDER_BOTTOM?|???????????CBRS_BORDER_LEFT?|?CBRS_BORDER_RIGHT|?CBRS_SIZE_DYNAMIC);??????SetBorders?();????????SetGrayDisabledButtons?(FALSE);????????return?0;??}??????BOOL?CMYToolBar::LoadToolBar(UINT?uiResID,?UINT?uiColdResID,?UINT?uiMenuResID,???????BOOL?bLocked,??????UINT?uiDisabledResID,?UINT?uiMenuDisabledResID,??????UINT?uiHotResID)??{??????if?(!CMFCToolBar::LoadToolBar?(uiResID,?uiColdResID,?uiMenuResID,?bLocked,???????????uiDisabledResID,?uiMenuDisabledResID,?uiHotResID))??????{??????????return?FALSE;??????}??????????return?TRUE;??}????BOOL?CMYToolBar::DrawButton(CDC*?pDC,?CMFCToolBarButton*?pButton,??????CMFCToolBarImages*?pImages,??????BOOL?bHighlighted,?BOOL?bDrawDisabledImages)??{??????ASSERT_VALID?(pDC);??????ASSERT_VALID?(pButton);??????????CMFCToolBarImages*?pNewImages?=?pImages;????????CAfxDrawState?ds;??????????????????????if?(!CMFCToolBar::DrawButton?(pDC,?pButton,?pNewImages,?bHighlighted,???????????bDrawDisabledImages))??????{??????????return?FALSE;??????}????????if?(pNewImages?!=?pImages)??????{??????????pNewImages->EndDrawImage?(ds);??????}????????return?TRUE;??}?? IMPLEMENT_DYNCREATE(CMYToolBar, CMFCToolBar)CMYToolBar::CMYToolBar()
{
}CMYToolBar::~CMYToolBar()
{
}BEGIN_MESSAGE_MAP(CMYToolBar, CMFCToolBar)ON_WM_CREATE()END_MESSAGE_MAP()/
// CMSMToolBar message handlersint CMYToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CMFCToolBar::OnCreate(lpCreateStruct) == -1)return -1;SetPaneStyle(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT| CBRS_SIZE_DYNAMIC);SetBorders ();SetGrayDisabledButtons (FALSE);return 0;
}BOOL CMYToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID, BOOL bLocked,UINT uiDisabledResID, UINT uiMenuDisabledResID,UINT uiHotResID)
{if (!CMFCToolBar::LoadToolBar (uiResID, uiColdResID, uiMenuResID, bLocked, uiDisabledResID, uiMenuDisabledResID, uiHotResID)){return FALSE;}return TRUE;
}BOOL CMYToolBar::DrawButton(CDC* pDC, CMFCToolBarButton* pButton,CMFCToolBarImages* pImages,BOOL bHighlighted, BOOL bDrawDisabledImages)
{ASSERT_VALID (pDC);ASSERT_VALID (pButton);CMFCToolBarImages* pNewImages = pImages;CAfxDrawState ds;/*if (!m_bMenuMode && (pButton->m_nStyle & (TBBS_PRESSED)) && m_PressedImages.GetCount () > 0){pNewImages = &m_PressedImages;pNewImages->SetTransparentColor (afxGlobalData.clrBtnFace);pNewImages->PrepareDrawImage (ds, GetImageSize (), FALSE);}*/if (!CMFCToolBar::DrawButton (pDC, pButton, pNewImages, bHighlighted, bDrawDisabledImages)){return FALSE;}if (pNewImages != pImages){pNewImages->EndDrawImage (ds);}return TRUE;
}mainfrm.cpp里的OnCreate里添加控件初始化代碼
[cpp] view plain
copy print?
???????UINT?uiToolbarHotID??=?IDB_HOTBITMAP;??UINT?uiToolbarColdID?=?IDB_COLDBITMAP;??UINT?uiToolbarDisID??=?IDB_DISBITMAP;??UINT?uiToolbarPresID?=?IDB_PRESBITMAP;??if?(!m_wndMyToolBar.CreateEx?(this,?TBSTYLE_FLAT,??????TBSTYLE_TOOLTIPS?|?CBRS_SIZE_DYNAMIC|??AFX_DEFAULT_TOOLBAR_STYLE)?||??????!m_wndMyToolBar.LoadToolBar?(IDR_MYTOOLBAR,?uiToolbarColdID,?0,???????TRUE,?uiToolbarDisID,?0,?uiToolbarHotID))??{??????TRACE0("Failed?to?create?toolbar\n");??????return?-1;????????}????m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);???EnableDocking(CBRS_ALIGN_ANY);????DockPane?(&m_wndMyToolBar);??m_wndMyToolBar.SetWindowText(_T("新的CMFCToolBar控件!"));?? UINT uiToolbarHotID = IDB_HOTBITMAP;UINT uiToolbarColdID = IDB_COLDBITMAP;UINT uiToolbarDisID = IDB_DISBITMAP;UINT uiToolbarPresID = IDB_PRESBITMAP;if (!m_wndMyToolBar.CreateEx (this, TBSTYLE_FLAT,TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC| AFX_DEFAULT_TOOLBAR_STYLE) ||!m_wndMyToolBar.LoadToolBar (IDR_MYTOOLBAR, uiToolbarColdID, 0, TRUE, uiToolbarDisID, 0, uiToolbarHotID)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockPane (&m_wndMyToolBar);m_wndMyToolBar.SetWindowText(_T("新的CMFCToolBar控件!"));
編譯運(yùn)行,就有結(jié)果了。還要添加各個按鈕的事件代碼,按鈕就可以enable了,在.h里寫 [cpp] view plain copy print? afx_msg?void?OnViewButton1();??afx_msg?void?OnUpdateViewButton1(CCmdUI*?pCmdUI);?? afx_msg void OnViewButton1();afx_msg void OnUpdateViewButton1(CCmdUI* pCmdUI);在.cpp里寫
[cpp] view plain
copy print?
ON_COMMAND(ID_BUTTON32774,?&CMainFrame::OnViewButton1)??ON_UPDATE_COMMAND_UI(ID_BUTTON32774,?&CMainFrame::OnUpdateViewButton1)?? ON_COMMAND(ID_BUTTON32774, &CMainFrame::OnViewButton1)ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)按鈕ID和代碼放的位置就不多說了
好了,至此完畢,可以拖動,浮動工具欄了。
========================================2014.12.22=============
今天找到方法進(jìn)行工具欄狀態(tài)的更新,就是按下工具欄某按鈕之后,該按鈕一直是按下的狀態(tài),鼠標(biāo)可以移開進(jìn)行其他操作。很簡單,設(shè)置一個按下狀態(tài)標(biāo)志位bBTDown,響應(yīng)
[cpp] view plain
copy print?
ON_UPDATE_COMMAND_UI(ID_BUTTON32774,?&CMainFrame::OnUpdateViewButton1)?? ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)里寫
[cpp] view plain
copy print?
pCmdUI->SetCheck(bBTDown);?? pCmdUI->SetCheck(bBTDown);
這里在view區(qū)進(jìn)行了畫線的操作,工具欄按鈕一直為按下狀態(tài)。同時,鼠標(biāo)指針也進(jìn)行了更改,讓起在客戶群為十字架,其他區(qū)域為普通指針,方法為響應(yīng)WM_SETCURSOR消息,函數(shù)里寫
[cpp] view plain
copy print?
BOOL?CMainFrame::OnSetCursor(CWnd*?pWnd,?UINT?nHitTest,?UINT?message)??{????????????if?(bBTDown)??????{??????????CToolBarView*?pView?=?(CToolBarView*)GetActiveView();??????????ASSERT(pView);??????????ASSERT(pWnd);??????????if?(pWnd?==?pView)??????????{??????????????SetCursor(LoadCursor(NULL,IDC_CROSS));??????????????return?TRUE;??????????}????????????????}????????return?CFrameWndEx::OnSetCursor(pWnd,?nHitTest,?message);??}??
BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{// TODO: Add your message handler code here and/or call defaultif (bBTDown){CToolBarView* pView = (CToolBarView*)GetActiveView();ASSERT(pView);ASSERT(pWnd);if (pWnd == pView){SetCursor(LoadCursor(NULL,IDC_CROSS));return TRUE;//這里要返回TRUE,否則閃爍}}return CFrameWndEx::OnSetCursor(pWnd, nHitTest, message);
}
========================================2014.12.25=============
今天找到添加提示的方法,很簡單,在第二張圖繪制工具欄圖標(biāo)的時候,在屬性窗口的promt里直接輸入信息
[cpp] view plain
copy print?
返回上一步操作\n返回按鈕??
返回上一步操作\n返回按鈕就可以了,特別是\n一定要有,效果如圖
總結(jié)
以上是生活随笔為你收集整理的从零起步CMFCToolBar用法详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。