MFC中单文档和多文档的工具栏停靠问题

一、MFC单文档中添加自定义工具栏

项目环境:VS2015,MFC单文档工程,项目类型Visual Studio

1.1、添加ToolBar资源

打开资源视图,添加ToolBar,命名IDR_TOOLBAR1,然后随便创建几个工具图标。

2.1、在项目中添加新增的ToolBar

打开主框架文件MainFrm.cpp,找到OnCreate函数,在系统工具栏创建代码的下面添加新工具栏的创建。

// MainFrm.cpp
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
	{
		TRACE0("未能创建工具栏\n");
		return -1;      // 未能创建
	}

	// 添加新的工具栏,m_wndNewToolBar在MainFrm.h中声明CMFCToolBar       m_wndNewToolBar;
	if (!m_wndNewToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndNewToolBar.LoadToolBar(IDR_TOOLBAR1))
	{
		TRACE0("未能创建新工具栏\n");
		return -1;      // 未能创建
	}
	m_wndNewToolBar.SetWindowText(_T("新工具栏"));
	m_wndNewToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, _T("新工具栏"));
	...
	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndNewToolBar.EnableDocking(CBRS_ALIGN_ANY);  // 新工具栏
	EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_wndMenuBar);
	DockPane(&m_wndToolBar);
	DockPane(&m_wndNewToolBar);  // 新工具栏

运行程序后,将程序最大化,或者关闭后再打开,多次运行程序,应该能够发现工具栏的位置总是不在期待的位置上。

MFC单文档程序能够自动将界面的布局保存到注册表中,在下一次打开的时候,会保存上一次的设置。我们可以通过删除注册表,去清除程序的布局信息。Win + R后,运行regedit,打开注册表,[HKEY_CURRENT_USER-Software-应用程序向导生成的本地应用程序]中找到自己工程的名称,然后将其全部删除,就可以清除程序所有的注册信息。

二、解决工具栏停靠问题

工具栏出现停靠位置不正确的主要原因是,工具栏在创建时都采用了默认的ID,这会导致两个工具栏采用同一组位置信息(所有的工具栏都是采用最后一个创建的工具栏的位置信息),所以位置总是会不在期待的位置上。
CreateEx()最后两个参数不使用默认,使用CRect(1, 1, 1, 1)和IDR_TOOLBAR1,修改代码如下:

// 添加新的工具栏
if (!m_wndNewToolBar.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_TOOLBAR1)||
		!m_wndNewToolBar.LoadToolBar(IDR_TOOLBAR1))
	{
		TRACE0("未能创建新工具栏\n");
		return -1;      // 未能创建
	}

运行代码,发现新创建的工具栏跑到菜单栏的上面去了,继续修改代码,

	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndNewToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockPane(&m_wndMenuBar);
	DockPane(&m_wndNewToolBar);      
	DockPaneLeftOf(&m_wndToolBar, &m_wndNewToolBar);    // 将新工具栏停靠在主工具栏的左边

删除此应用程序的注册信息后,再运行程序,显示正常。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值