今天遇到了一个问题,关于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~

转载于:https://www.cnblogs.com/junx1989/archive/2012/07/21/junx1989_20120721182415.html

VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题相关推荐

  1. MFC单文档中,增加,删除 工具栏图标

    mfc单文档中,增加,修改,删除 工具栏图标方法: 首先,说明下,在资源视图中,XXX.rc下有个Toolbar,双击打开,如图所示,toolbar中有IDR_MAINFRAME_256和IDR_MA ...

  2. MFC 多文档中同时打开多个文档

    MFC多文档中的打开继承自CWinAppEx中的函数OnFileOpen(),这一点在CXXX.cpp中可以看到.比如如下: [cpp] view plain copy // CCVMFCApp BE ...

  3. OpenCASCADE(OCC) X64 在 MFC多文档中的应用案例(入门)

    先上运行结果图: 1.Open CASCADE-7.6.0的下载 Download - Open CASCADE Technology !!!!!!下载安装的路径一定要是英文!!!!!! 如果你下载后 ...

  4. MFC多文档中opencv处理图像打开、保存

    需要在C**Doc和C**View中进行相应修改 图像打开: Doc.cpp中: [cpp] view plain copy BOOL CCVMFCDoc::Load(IplImage** pp, L ...

  5. mfc单文档中如何将view的基类由CView转为CScrollview

     软件环境visual Studio 2005 CScrollView这个类用于需要滚动条的场合. 如果我们的程序原来用的是CView类,此时想改成CScrollView类,需要做如下修改 第一: ...

  6. 在MFC单文档中,如何操作状态栏

    CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;//要求包含MainFrm.h头文件 CStatusBar *m_StatusBa ...

  7. 计算机word工具栏图片,在word文档中画出逼真的电脑显示器

    9.用PS制作一张英文字母图片,字母设置为白色,作为电脑显示器的LOGO,把LOGO图片保存为PNG格式. 回到word文档这里,在文档上方的菜单栏中顺序点:插入--图片--来自文件: 把刚才PS弄好 ...

  8. MFC单文档框架编程(二): SDI框架下的消息处理

    MFC单文档框架编程(一) ...................................................................................... ...

  9. 基于MFC多文档多视图结构的OGRE指北针程序

    基于MFC多文档多视图结构的OGRE指北针程序 0.前沿 作者: 化凡 QQ: 371691096 Mail:zhixu_07@163.com 1.  功能描述 本程序作为OGRE和MFC结合,欲实现 ...

最新文章

  1. zabbix trapper方式监控
  2. 产品经理能力模型 答网友问
  3. 2019年湘潭大学程序设计竞赛(重现赛)F.Truthman or Fakeman(并查集)
  4. [Java基础]异常概述与异常处理
  5. 梦聆轻量化音乐播放器源码
  6. 《跑跑卡丁车》国内运营商裁员超30%
  7. 嵌入式开发与C++开发的区别是什么?
  8. c# 不同窗体之间传值和调用
  9. 顺通机器人_机器人检测
  10. 周志华 机器学习ppt
  11. github精选awsome
  12. 第三篇 ME909s-821设备描述符分析
  13. 教你学java_教妹学Java:Spring 入门篇
  14. 字体图标的下载与使用
  15. 谷歌科学家:目标优化不好使?今天聊聊泛化这件事儿
  16. Linux配置JavaWeb环境(JDK+Tmocat+Mysql+Nginx+Redis+IDEA部署)
  17. C++ vector函数
  18. 三大运营商eSIM商用情况
  19. 老农解决猫狗鱼的问题(黑马基础习题)
  20. 跟着川川学习python爬虫的第一天

热门文章

  1. VI编辑,backspace无法删除解决方法
  2. [AngularJS] 理解AngularJS Directive中的Scope
  3. 转:怎样在VMware ESXi上 克隆虚拟机
  4. Hibernate之Hello World篇
  5. 手把手教你用Scrapy爬取知乎大V粉丝列表
  6. STM32之CAN总线原理
  7. linux文件夹重命名busy,Linux下执行程序出现 Text file busy 提示时的解决方法
  8. 这 5 条 IntelliJ IDEA 调试技巧太强了!
  9. 面试必问:用 Java 写一个内存泄漏程序
  10. 有了这款IDEA插件,再也不需要postman了