MFC中单文档和多文档的工具栏停靠问题
程序员文章站
2024-03-20 21:05:40
...
一、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); // 将新工具栏停靠在主工具栏的左边
删除此应用程序的注册信息后,再运行程序,显示正常。
上一篇: 窥探MySQL集群之主从复制
推荐阅读