MFC--停靠工具栏
来源:互联网 发布:随手记mac版 编辑:程序博客网 时间:2024/06/05 00:25
原文网址:http://www.cnblogs.com/junx1989/archive/2012/07/21/junx1989_20120721182415.html?utm_source=tuicool&utm_medium=referral
VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题
今天遇到了一个问题,关于VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题。
关于CMFCToolBar的一些介绍网上也有人介绍过,就不过多介绍了,直奔主题。
解决问题的关键点就在于,如想将CMFCToolBar正常停靠的话,需要在其Create的时候,加上后面的ID,使其ID值不能相同。
目的:
我一共有四个工具栏,想将它进行停靠在两行,每行两个工具栏。
做法:
1. 在InitInstance的适当地方加入
CleanState(_T("WorkSpace"));
2. 在CMainFrame的类定义中加入
CMFCToolBar m_wndToolBar2;CMFCToolBar m_wndToolBar3;CMFCToolBar m_wndToolBar4;
3. 在CMainFrame中的OnCreate中加入:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ ... if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR3)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndToolBar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar3.LoadToolBar(IDR_PROPERTIES)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndToolBar4.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar4.LoadToolBar(IDR_SORT)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } ... m_wndToolBar2.SetWindowText( _T("JunxToolBar2") ); m_wndToolBar3.SetWindowText( _T("JunxToolBar3") ); m_wndToolBar4.SetWindowText( _T("JunxToolBar4") ); ... m_wndToolBar2.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); m_wndToolBar3.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); m_wndToolBar4.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); ... m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar3.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar4.EnableDocking(CBRS_ALIGN_ANY); ... DockPaneLeftOf(&m_wndToolBar2, &m_wndToolBar); // 将m_wndToolBar2停靠在m_wndToolBar的左边 DockPane(&m_wndToolBar3); // 将m_wndToolBar3停靠在下一行 DockPaneLeftOf(&m_wndToolBar4, &m_wndToolBar3); // 将m_wndToolBar4停靠在m_wndToolBar3的左边 ...}
结果:
做法很简单,但是出现一个奇怪现象,就是在下面的工具条竟然不见了。后来在菜单视图->工具栏和停靠窗口->自定义下的工具栏选项卡中,点击不见的
那个工具条发现,它竟然跑到了菜单栏上面去了,被菜单栏给挡住了,真是奇怪。
解决:
后来在微软提供的sample中,默认是在
C:\Program Files\Microsoft Visual Studio 10.0\Samples\2052\VC2010Samples\C++\MFC\Visual C++ 2008 Feature Pack\VisualStudioDemo下
的VisualStudioDemo.sln工程
将VC2010Samples.zip解压开即可
发现这工程竟然可以完整的停靠,然后开始了对比究竟有什么不同,终于被我发现,原来这例子在m_wndToolBar2的Create的时候传递了ID值,然后,我
也加上,竟奇迹般的解决了。显示正常,四个工具栏两行显示,每行两个。
Create部分的代码修改如下:
如在每个Create的后面多加上两个参数就好了: , CRect(1, 1, 1, 1), IDR_TOOLBAR3
if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), IDR_TOOLBAR3) || !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR3)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndToolBar3.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), IDR_PROPERTIES) || !m_wndToolBar3.LoadToolBar(IDR_PROPERTIES)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 } if (!m_wndToolBar4.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1, 1, 1, 1), IDR_SORT) || !m_wndToolBar4.LoadToolBar(IDR_SORT)) { TRACE0("未能创建工具栏\n"); return -1; // 未能创建 }
后记:
在极度奇怪和郁闷之后,后来发现最后那个ID的默认值是AFX_IDW_TOOLBAR,在查看AFX_IDW_TOOLBAR的定义时,发现了下面的如下一段,原来微软在这
里告知了呀,真隐蔽,我是没有找到,要不是那个例子,我想我还在郁闷中呢。
afxres.h从第117行开始,列出如下:
#define AFX_IDW_TOOLBAR 0xE800 // main Toolbar for window#define AFX_IDW_STATUS_BAR 0xE801 // Status bar window#define AFX_IDW_PREVIEW_BAR 0xE802 // PrintPreview Dialog Bar#define AFX_IDW_RESIZE_BAR 0xE803 // OLE in-place resize bar#define AFX_IDW_REBAR 0xE804 // COMCTL32 "rebar" Bar#define AFX_IDW_DIALOGBAR 0xE805 // CDialogBar// Note: If your application supports docking toolbars, you should// not use the following IDs for your own toolbars. The IDs chosen// are at the top of the first 32 such that the bars will be hidden// while in print preview mode, and are not likely to conflict with// IDs your application may have used succesfully in the past.
另外遇到一些小问题(自己记录一下,方便以后查看,吼吼):
由于加入了导航窗格,故对注册表进行一次清理,在InitInstance的适当地方加入
CleanState(_T("WorkSpace"));
目前对于此问题的所以然,还是有些模糊,请哪位大侠知道的,不吝赐教,3Q~
- MFC--停靠工具栏
- 如何在MFC中加入工具栏和停靠窗口
- VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题
- MFC工具栏停靠到左边栏的BUG
- VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)
- VC多工具栏停靠
- 工具栏停靠控制详述
- 停靠窗口和工具栏
- 一个工具栏紧随另一个工具栏停靠
- [VB.NET]创建停靠工具栏
- 控制工具栏停靠的位置。
- 工具栏的创建和停靠
- MFC 中的停靠栏
- MFC--CDIALOGBAR停靠优先级
- MFC--CDockablePane停靠窗口
- 在mfc的sdi/mdi程序任意视图view内创建可停靠及浮动的工具栏方法
- qt可停靠控件和工具栏
- 6.5 可停靠控件及工具栏(Dock Widgets and Toolbars)
- 2 python 四位数整数补零
- 关于持久层主键生成策略
- 查看本地数据库或表实际大小
- Javascript中的e.keyCode大全
- 使用QDir遍历指定目录下的指定文件
- MFC--停靠工具栏
- 第十二章 对象(上)
- LeetCode 14. Longest Common Prefix
- Ubuntu下Node.js和nw.js环境搭建
- 使用 Intellij idea Springboot maven 的一个小小的问题
- 5 个 iOS 和 Android 最佳的开源自动化工具
- 区块链开发(四)区块链技术详解PPT
- 文本数据的机器学习自动分类方法(上)
- lite-server工具使用