从零起步CMFCToolBar用法详解
CMFCToolBar是vs08sp1以后引入的新的工具栏控件,和Ribbon主题结合的很好,不同与CToolBar,它是从CPane派生出来的,用法跟CToolbar 有一些不同,研究了几天,记录在下面。
- 首先给出工具栏四种状态图标BMP文件,这4个文件分别为图标按钮的Cold、Hot、Disabled、Enabled状态,资源是从VS的MSMoney这个Demo里考出来的,每个按钮大小时46*46。效果见下图,这里给出本站下载资源。
- 新建一个空白SDI文档,选用Ribbon主题。找到资源工具栏-Toobar上右键新建一个toolbar,取名IDR_MYTOOLBAR,在右侧的编辑栏里将新建出来的工具栏第一个图标的属性-Height和width改为46*46,此时图标会变大。见下图。用铅笔工具在这个图标上随便画个东西,完成时,它的右侧会多一个图标,继续画,一直第6个图标(此时会有第7个出来,不用画了)。
- 导入下载的四个bmp文件到资源里,如下图,ID分别取好。
- 用类向导从CMFCToolBar里派生一个新类,或者直接拷贝下面的代码到Mainfrm.h文件里
[cpp] view plain copy print?
- 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);
- };
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添加类实现代码
[cpp] view plain copy print?
- IMPLEMENT_DYNCREATE(CMYToolBar, CMFCToolBar)
- CMYToolBar::CMYToolBar()
- {
- }
- CMYToolBar::~CMYToolBar()
- {
- }
- BEGIN_MESSAGE_MAP(CMYToolBar, CMFCToolBar)
- ON_WM_CREATE()
- END_MESSAGE_MAP()
- /
- // CMSMToolBar message handlers
- 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 (!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;
- }
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; // fail to create
- }
- 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控件!"));
- 编译运行,就有结果了。
- 还要添加各个按钮的事件代码,按钮就可以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和代码放的位置就不多说了
- 好了,至此完毕,可以拖动,浮动工具栏了。
- ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)
ON_UPDATE_COMMAND_UI(ID_BUTTON32774, &CMainFrame::OnUpdateViewButton1)
里写
- pCmdUI->SetCheck(bBTDown);
pCmdUI->SetCheck(bBTDown);
这里在view区进行了画线的操作,工具栏按钮一直为按下状态。同时,鼠标指针也进行了更改,让起在客户群为十字架,其他区域为普通指针,方法为响应WM_SETCURSOR消息,函数里写
- BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
- {
- // TODO: Add your message handler code here and/or call default
- if (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);
- }
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里直接输入信息
- 返回上一步操作\n返回按钮
返回上一步操作\n返回按钮
就可以了,特别是\n一定要有,效果如图
从零起步CMFCToolBar用法详解相关推荐
- ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解
一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...
- C#中NameValueCollection类用法详解
C#中NameValueCollection类用法详解,1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCol ...
- SQL语句 SELECT LIKE用法详解
在SQL结构化查询语言中,LIKE语句有着至关重要的作用. LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用 ...
- c++ memset 语言_C++中memset函数用法详解
本文实例讲述了C++中memset函数用法.分享给大家供大家参考,具体如下: 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常 ...
- STL中map和string, vector 用法详解
1. map 用法详解 std map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成 ...
- sizeof,strlen用法详解
sizeof 前向声明: sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但 ...
- pdo mysql limit_PHP mysql中limit用法详解(代码示例)
在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...
- response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
response.setHeader()用法详解,转载记录: 1. HTTP消息头 (1)通用信息头 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Prag ...
- access中的Format用法详解
access中的Format用法详解 Format$(Now,"EEOA") 只要这么一句~~~~~就可以得到" 二○○六年五月二十六日" ---------- ...
最新文章
- python项目实例初学者-经典Python案例,初学者的小帮手,立马学会Python!
- 第二章 GuassDB 数据库基础知识
- dell 远程访问管理卡iDRAC 7
- 安卓中关于dialog.builder问题
- 《Photoshop修饰与合成专业技法》—第1章利用图层样式改进抠像
- Python中的shuffle()函数的使用
- ELK日志分析平台.1-搭建
- 【转】HMAC哈希消息认证码及算法原理
- Linux和Windows下计算文件的Hash值
- chrome 控制台信息获取 python_通过chrome浏览器控制台(Console)进行PHP Debug的方法
- micropython mqtt 重连_ESP32/ESP8266使用MicroPython利用MQTT发布DHT11/DHT22传感器数据
- Canvas 数学、物理、动画学习笔记一
- qt-opensource-windows-x86-vs2010-4.8.6 + qt-creator-windows-opensource-2.8.0
- labview 快捷键
- Sqlloader导数据进数据库时间过长或卡住原因探讨及解决办法
- 安卓版有道词典的离线词库-《21世纪大英汉词典》等_我是亲民_新浪博客
- iOS实现音频和视频播放-运用AVPlayer
- 怎样花两年时间去面试一个人(转自MIND HACKS)
- 王琪你计算机学院,计算机学院成功举办第四届青春飞扬大赛
- 51单片机学习笔记(8)——74HC573锁存器
热门文章
- 超微四子星服务器_224核心448线程服务器---Supermicro超微高密四子星 2029BT-HNTR 数量不多只有60台...
- usleep延时0.毫秒_LabVIEW从0到1系列视频培训_第4讲全集_操作例程说明
- .net bootstrap 下拉树状选择框_Bootstrap搭建图书管理系统
- 使用shell进行mvn打包,根据mvn是否打包成功来进行下一步操作
- Soring冲刺计划第三天(个人)
- POJ 1655 Balancing Act (求树的重心)【树形DP】(经典)
- SQLSERVER 2014 SP1 的服务器 日志文件无法收缩的处理
- IIS+php无法上传图片(转载自http://hi.baidu.com/0wem/blog/item/d222db163c3c831e972b4306.html)...
- ThinkPHP5显示数据库字段内容
- python raise 引起的异常