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 print?
    1. class CMYToolBar : public CMFCToolBar
    2. {
    3. public:
    4. DECLARE_DYNCREATE(CMYToolBar)
    5. // Construction
    6. public:
    7. CMYToolBar();
    8. virtual ~CMYToolBar ();
    9. public:
    10. virtual BOOL LoadToolBar (UINT uiResID, UINT uiColdResID = 0,
    11. UINT uiMenuResID = 0, BOOL bLocked = FALSE,
    12. UINT uiDisabledResID = 0, UINT uiMenuDisabledResID = 0,
    13. UINT uiHotResID = 0);
    14. protected:
    15. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    16. DECLARE_MESSAGE_MAP()
    17. virtual BOOL DrawButton (CDC* pDC, CMFCToolBarButton* pButton,
    18. CMFCToolBarImages* pImages, BOOL bHighlighted,
    19. BOOL bDrawDisabledImages);
    20. };
    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?
    1. CMYToolBar          m_wndMyToolBar;
    CMYToolBar           m_wndMyToolBar;
  5. mainfrm.cpp添加类实现代码
    [cpp] view plain copy print?
    1. IMPLEMENT_DYNCREATE(CMYToolBar, CMFCToolBar)
    2. CMYToolBar::CMYToolBar()
    3. {
    4. }
    5. CMYToolBar::~CMYToolBar()
    6. {
    7. }
    8. BEGIN_MESSAGE_MAP(CMYToolBar, CMFCToolBar)
    9. ON_WM_CREATE()
    10. END_MESSAGE_MAP()
    11. /
    12. // CMSMToolBar message handlers
    13. int CMYToolBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
    14. {
    15. if (CMFCToolBar::OnCreate(lpCreateStruct) == -1)
    16. return -1;
    17. SetPaneStyle(CBRS_GRIPPER | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM |
    18. CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT| CBRS_SIZE_DYNAMIC);
    19. SetBorders ();
    20. SetGrayDisabledButtons (FALSE);
    21. return 0;
    22. }
    23. BOOL CMYToolBar::LoadToolBar(UINT uiResID, UINT uiColdResID, UINT uiMenuResID,
    24. BOOL bLocked,
    25. UINT uiDisabledResID, UINT uiMenuDisabledResID,
    26. UINT uiHotResID)
    27. {
    28. if (!CMFCToolBar::LoadToolBar (uiResID, uiColdResID, uiMenuResID, bLocked,
    29. uiDisabledResID, uiMenuDisabledResID, uiHotResID))
    30. {
    31. return FALSE;
    32. }
    33. return TRUE;
    34. }
    35. BOOL CMYToolBar::DrawButton(CDC* pDC, CMFCToolBarButton* pButton,
    36. CMFCToolBarImages* pImages,
    37. BOOL bHighlighted, BOOL bDrawDisabledImages)
    38. {
    39. ASSERT_VALID (pDC);
    40. ASSERT_VALID (pButton);
    41. CMFCToolBarImages* pNewImages = pImages;
    42. CAfxDrawState ds;
    43. /*
    44. if (!m_bMenuMode && (pButton->m_nStyle & (TBBS_PRESSED)) &&
    45. m_PressedImages.GetCount () > 0)
    46. {
    47. pNewImages = &m_PressedImages;
    48. pNewImages->SetTransparentColor (afxGlobalData.clrBtnFace);
    49. pNewImages->PrepareDrawImage (ds, GetImageSize (), FALSE);
    50. }
    51. */
    52. if (!CMFCToolBar::DrawButton (pDC, pButton, pNewImages, bHighlighted,
    53. bDrawDisabledImages))
    54. {
    55. return FALSE;
    56. }
    57. if (pNewImages != pImages)
    58. {
    59. pNewImages->EndDrawImage (ds);
    60. }
    61. return TRUE;
    62. }
    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?
    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. m_wndMyToolBar.EnableDocking(CBRS_ALIGN_ANY);
    14. EnableDocking(CBRS_ALIGN_ANY);
    15. DockPane (&m_wndMyToolBar);
    16. 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控件!"));
  6. 编译运行,就有结果了。
  7. 还要添加各个按钮的事件代码,按钮就可以enable了,在.h里写
    [cpp] view plain copy print?
    1. afx_msg void OnViewButton1();
    2. afx_msg void OnUpdateViewButton1(CCmdUI* pCmdUI);
     afx_msg void OnViewButton1();afx_msg void OnUpdateViewButton1(CCmdUI* pCmdUI);

    在.cpp里写

    [cpp] view plain copy print?
    1. ON_COMMAND(ID_BUTTON32774, &CMainFrame::OnViewButton1)
    2. ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)
     ON_COMMAND(ID_BUTTON32774, &CMainFrame::OnViewButton1)ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)

    按钮ID和代码放的位置就不多说了

  8. 好了,至此完毕,可以拖动,浮动工具栏了。
========================================2014.12.22=============
今天找到方法进行工具栏状态的更新,就是按下工具栏某按钮之后,该按钮一直是按下的状态,鼠标可以移开进行其他操作。很简单,设置一个按下状态标志位bBTDown,响应

[cpp] view plain copy print?
  1. ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)
ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)

里写

[cpp] view plain copy print?
  1. pCmdUI->SetCheck(bBTDown);
pCmdUI->SetCheck(bBTDown);

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

[cpp] view plain copy print?
  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. return CFrameWndEx::OnSetCursor(pWnd, nHitTest, message);
  16. }
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=============

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

[cpp] view plain copy print?
  1. 返回上一步操作\n返回按钮
返回上一步操作\n返回按钮

就可以了,特别是\n一定要有,效果如图

从零起步CMFCToolBar用法详解相关推荐

  1. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  2. C#中NameValueCollection类用法详解

    C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...

  3. SQL语句 SELECT LIKE用法详解

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...

  4. c++ memset 语言_C++中memset函数用法详解

    本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...

  5. STL中map和string, vector 用法详解

    1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...

  6. sizeof,strlen用法详解

    sizeof 前向声明: sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但 ...

  7. pdo mysql limit_PHP mysql中limit用法详解(代码示例)

    在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...

  8. response.setHeader()的用法详解及实现文件下载过程中出现问题的分析

    response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...

  9. access中的Format用法详解

    access中的Format用法详解 Format$(Now,"EEOA") 只要这么一句~~~~~就可以得到" 二○○六年五月二十六日" ---------- ...

最新文章

  1. python项目实例初学者-经典Python案例,初学者的小帮手,立马学会Python!
  2. 第二章 GuassDB 数据库基础知识
  3. dell 远程访问管理卡iDRAC 7
  4. 安卓中关于dialog.builder问题
  5. 《Photoshop修饰与合成专业技法》—第1章利用图层样式改进抠像
  6. Python中的shuffle()函数的使用
  7. ELK日志分析平台.1-搭建
  8. 【转】HMAC哈希消息认证码及算法原理
  9. Linux和Windows下计算文件的Hash值
  10. chrome 控制台信息获取 python_通过chrome浏览器控制台(Console)进行PHP Debug的方法
  11. micropython mqtt 重连_ESP32/ESP8266使用MicroPython利用MQTT发布DHT11/DHT22传感器数据
  12. Canvas 数学、物理、动画学习笔记一
  13. qt-opensource-windows-x86-vs2010-4.8.6 + qt-creator-windows-opensource-2.8.0
  14. labview 快捷键
  15. Sqlloader导数据进数据库时间过长或卡住原因探讨及解决办法
  16. 安卓版有道词典的离线词库-《21世纪大英汉词典》等_我是亲民_新浪博客
  17. iOS实现音频和视频播放-运用AVPlayer
  18. 怎样花两年时间去面试一个人(转自MIND HACKS)
  19. 王琪你计算机学院,计算机学院成功举办第四届青春飞扬大赛
  20. 51单片机学习笔记(8)——74HC573锁存器

热门文章

  1. 超微四子星服务器_224核心448线程服务器---Supermicro超微高密四子星 2029BT-HNTR 数量不多只有60台...
  2. usleep延时0.毫秒_LabVIEW从0到1系列视频培训_第4讲全集_操作例程说明
  3. .net bootstrap 下拉树状选择框_Bootstrap搭建图书管理系统
  4. 使用shell进行mvn打包,根据mvn是否打包成功来进行下一步操作
  5. Soring冲刺计划第三天(个人)
  6. POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)
  7. SQLSERVER 2014 SP1 的服务器 日志文件无法收缩的处理
  8. IIS+php无法上传图片(转载自http://hi.baidu.com/0wem/blog/item/d222db163c3c831e972b4306.html)...
  9. ThinkPHP5显示数据库字段内容
  10. python raise 引起的异常