CMFCToolBar用法详解

CMFCToolBar是vs08sp1以后引入的新的工具栏控件,和Ribbon主题结合的很好,不同与CToolBar,它是从CPane派生出来的,用法跟CToolbar 有一些不同,研究了几天,记录在下面。

  1. 首先给出工具栏四种状态图标BMP文件,这4个文件分别为图标按钮的Cold、Hot、Disabled、Enabled状态,资源是从VS的MSMoney这个Demo里考出来的,每个按钮大小时46*46。效果见下图,这里给出本站下载资源
  2. 新建一个空白SDI文档,选用Ribbon主题。找到资源工具栏-Toobar上右键新建一个toolbar,取名IDR_MYTOOLBAR,在右侧的编辑栏里将新建出来的工具栏第一个图标的属性-Height和width改为46*46,此时图标会变大。见下图。用铅笔工具在这个图标上随便画个东西,完成时,它的右侧会多一个图标,继续画,一直第6个图标(此时会有第7个出来,不用画了)。
  3. 导入下载的四个bmp文件到资源里,如下图,ID分别取好。
  4. 用类向导从CMFCToolBar里派生一个新类,或者直接拷贝下面的代码到Mainfrm.h文件里
    [cpp]  view plain  copy
    1. class CMYToolBar : public CMFCToolBar  
    2. {  
    3. public:   
    4.     DECLARE_DYNCREATE(CMYToolBar)  
    5.   
    6.     // Construction  
    7. public:  
    8.     CMYToolBar();  
    9.   
    10.     virtual ~CMYToolBar ();  
    11. public:  
    12.     virtual BOOL LoadToolBar (UINT uiResID, UINT uiColdResID = 0,   
    13.         UINT uiMenuResID = 0, BOOL bLocked = FALSE,  
    14.         UINT uiDisabledResID = 0, UINT uiMenuDisabledResID = 0,  
    15.         UINT uiHotResID = 0);  
    16.   
    17. protected:  
    18.     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
    19.     DECLARE_MESSAGE_MAP()  
    20.   
    21.     virtual BOOL DrawButton (CDC* pDC, CMFCToolBarButton* pButton,   
    22.         CMFCToolBarImages* pImages, BOOL bHighlighted,  
    23.         BOOL bDrawDisabledImages);  
    24.   
    25. };  
    mainfrm类里添加控件变量
    [cpp]  view plain  copy
    1. CMYToolBar          m_wndMyToolBar;  

  5. mainfrm.cpp添加类实现代码
    [cpp]  view plain  copy
    1. IMPLEMENT_DYNCREATE(CMYToolBar, CMFCToolBar)  
    2.   
    3. CMYToolBar::CMYToolBar()  
    4. {  
    5. }  
    6.   
    7.   
    8. CMYToolBar::~CMYToolBar()  
    9. {  
    10. }  
    11.   
    12.   
    13. BEGIN_MESSAGE_MAP(CMYToolBar, CMFCToolBar)  
    14.     ON_WM_CREATE()  
    15.       
    16. END_MESSAGE_MAP()  
    17.   
    18. /  
    19. // CMSMToolBar message handlers  
    20.   
    21. int CMYToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct)   
    22. {  
    23.     if (CMFCToolBar::OnCreate(lpCreateStruct) == -1)  
    24.         return -1;  
    25.   
    26.     SetPaneStyle(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM |   
    27.         CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT| CBRS_SIZE_DYNAMIC);  
    28.     SetBorders ();  
    29.   
    30.     SetGrayDisabledButtons (FALSE);  
    31.   
    32.     return 0;  
    33. }  
    34.   
    35.   
    36. BOOL CMYToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID,   
    37.     BOOL bLocked,  
    38.     UINT uiDisabledResID, UINT uiMenuDisabledResID,  
    39.     UINT uiHotResID)  
    40. {  
    41.     if (!CMFCToolBar::LoadToolBar (uiResID, uiColdResID, uiMenuResID, bLocked,   
    42.         uiDisabledResID, uiMenuDisabledResID, uiHotResID))  
    43.     {  
    44.         return FALSE;  
    45.     }  
    46.   
    47.   
    48.     return TRUE;  
    49. }  
    50.   
    51. BOOL CMYToolBar::DrawButton(CDC* pDC, CMFCToolBarButton* pButton,  
    52.     CMFCToolBarImages* pImages,  
    53.     BOOL bHighlighted, BOOL bDrawDisabledImages)  
    54. {  
    55.     ASSERT_VALID (pDC);  
    56.     ASSERT_VALID (pButton);  
    57.   
    58.   
    59.     CMFCToolBarImages* pNewImages = pImages;  
    60.   
    61.     CAfxDrawState ds;  
    62.     /* 
    63.     if (!m_bMenuMode && (pButton->m_nStyle & (TBBS_PRESSED)) &&  
    64.         m_PressedImages.GetCount () > 0) 
    65.     { 
    66.         pNewImages = &m_PressedImages; 
    67.  
    68.         pNewImages->SetTransparentColor (afxGlobalData.clrBtnFace); 
    69.  
    70.         pNewImages->PrepareDrawImage (ds, GetImageSize (), FALSE); 
    71.     } 
    72.     */  
    73.     if (!CMFCToolBar::DrawButton (pDC, pButton, pNewImages, bHighlighted,   
    74.         bDrawDisabledImages))  
    75.     {  
    76.         return FALSE;  
    77.     }  
    78.   
    79.     if (pNewImages != pImages)  
    80.     {  
    81.         pNewImages->EndDrawImage (ds);  
    82.     }  
    83.   
    84.     return TRUE;  
    85. }  
    mainfrm.cpp里的OnCreate里添加控件初始化代码
    [cpp]  view plain  copy
    1.        UINT uiToolbarHotID  = IDB_HOTBITMAP;  
    2. UINT uiToolbarColdID = IDB_COLDBITMAP;  
    3. UINT uiToolbarDisID  = IDB_DISBITMAP;  
    4. UINT uiToolbarPresID = IDB_PRESBITMAP;  
    5. if (!m_wndMyToolBar.CreateEx (this, TBSTYLE_FLAT,  
    6.     TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC|  AFX_DEFAULT_TOOLBAR_STYLE) ||  
    7.     !m_wndMyToolBar.LoadToolBar (IDR_MYTOOLBAR, uiToolbarColdID, 0,   
    8.     TRUE, uiToolbarDisID, 0, uiToolbarHotID))  
    9. {  
    10.     TRACE0("Failed to create toolbar\n");  
    11.     return -1;      // fail to create  
    12. }  
    13.   
    14. m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);   
    15. EnableDocking(CBRS_ALIGN_ANY);    
    16. DockPane (&m_wndMyToolBar);  
    17. m_wndMyToolBar.SetWindowText(_T("新的CMFCToolBar控件!"));  
  6. 编译运行,就有结果了。
  7. 还要添加各个按钮的事件代码,按钮就可以enable了,在.h里写
    [cpp]  view plain  copy
    1. afx_msg void OnViewButton1();  
    2. afx_msg void OnUpdateViewButton1(CCmdUI* pCmdUI);  
    在.cpp里写
    [cpp]  view plain  copy
    1. ON_COMMAND(ID_BUTTON32774, &CMainFrame::OnViewButton1)  
    2. ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)  
    按钮ID和代码放的位置就不多说了
  8. 好了,至此完毕,可以拖动,浮动工具栏了。
========================================2014.12.22=============
今天找到方法进行工具栏状态的更新,就是按下工具栏某按钮之后,该按钮一直是按下的状态,鼠标可以移开进行其他操作。很简单,设置一个按下状态标志位bBTDown,响应
[cpp]  view plain  copy
  1. ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)  
里写
[cpp]  view plain  copy
  1. pCmdUI->SetCheck(bBTDown);  


这里在view区进行了画线的操作,工具栏按钮一直为按下状态。同时,鼠标指针也进行了更改,让起在客户群为十字架,其他区域为普通指针,方法为响应WM_SETCURSOR消息,函数里写

[cpp]  view plain  copy
  1. BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)  
  2. {  
  3.     // TODO: Add your message handler code here and/or call default  
  4.     if (bBTDown)  
  5.     {  
  6.         CToolBarView* pView = (CToolBarView*)GetActiveView();  
  7.         ASSERT(pView);  
  8.         ASSERT(pWnd);  
  9.         if (pWnd == pView)  
  10.         {  
  11.             SetCursor(LoadCursor(NULL,IDC_CROSS));  
  12.             return TRUE;//这里要返回TRUE,否则闪烁  
  13.         }  
  14.           
  15.     }  
  16.   
  17.     return CFrameWndEx::OnSetCursor(pWnd, nHitTest, message);  
  18. }  

========================================2014.12.25=============

今天找到添加提示的方法,很简单,在第二张图绘制工具栏图标的时候,在属性窗口的promt里直接输入信息

[cpp]  view plain  copy
  1. 返回上一步操作\n返回按钮  
就可以了,特别是\n一定要有,效果如图
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用cmfctoolbar设置背景颜色需要先通过CFrameWnd::GetControlBar 函数获取到cmfctoolbar控件的指针,然后调用SetPaneStyle 函数设置控件的样式。可以通过如下代码实现: CMFCToolBar* pToolBar = NULL; CFrameWnd* pFrameWnd = AfxGetMainWnd(); if (pFrameWnd != NULL) { pToolBar = (CMFCToolBar*)pFrameWnd->GetControlBar(ID_TOOLBAR); } if (pToolBar != NULL) { pToolBar->SetPaneStyle(pToolBar->GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_GRIPPER | CBRS_BORDER_BOTTOM); pToolBar->SetPaneFillColor(RGB(255, 255, 255)); //背景颜色设置为白色 } 此代码获取到主窗口中ID为ID_TOOLBAR的cmfctoolbar控件,然后设置它的样式和背景颜色。SetPaneFillColor 函数用于设置控件的背景颜色,传入的参数为RGB值。可以自由替换RGB值来设置自己喜欢的颜色。 ### 回答2: 在使用CMFCToolBar控件时,我们可以通过以下步骤来设置它的背景颜色: 1. 在工程中添加头文件afxcontrolbars.h。 2. 在创建CMFCToolBar对象之前,设置其颜色属性。例如: CMFCToolBar m_wndToolBar; m_wndToolBar.SetBackgroundColor(RGB(0, 255, 0)); 其中,RGB(0, 255, 0)表示绿色的RGB值。 3. 如果需要在运行时改变背景颜色,我们可以在程序中捕捉WM_PALETTECHANGED消息,并调用CMFCToolBar的Invalidate()方法来更新界面,例如: void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) { CMDIFrameWnd::OnPaletteChanged(pFocusWnd); if (m_wndToolBar.GetSafeHwnd() != NULL) { // 重新绘制工具栏 m_wndToolBar.Invalidate(); } } 通过以上步骤,我们可以轻松地为CMFCToolBar设置背景颜色,让界面变得更加美观。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值