VC2008 SP1下的MFC 工具条初始停靠位置问题

时间:2022-11-09 10:26:40
我想新建一个CMFCToolBar 可以悬浮在客户区,或是停靠在框架的右边,但是结果根本就和我想象的一点都不一样,两个工具条的初始位置非常乱。

非常之奇怪于是我新建了一个项目,只对其中默认加载IDR_MAINFRAME的m_wndToolBar进行操作,下面是OnCreate中的和m_wndToolBar相关的源码

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_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndToolBar);

照理来说,EnableDocking(CBRS_ALIGN_ANY)允许各种菜单对象进行停靠
          CBRS_TOP指定了m_wndToolBar初始的停靠位置
          而m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY)允许m_wndToolBar自身在用户操作下移动到客户区任意窗口进行停靠

但最终的结果是CBRS_TOP这个参数经常会不起作用,当我把它改为CBRS_RIGHT的时候,它也不会停靠到右边,把它改回为CBRS_TOP的时候,它竟然悬浮在客户区中! 有的时候,两次F5出的结果也会不一样,第一次它直接失踪了,第二次才显示出来

请问究竟哪个函数是可以设置某个工具栏的初始停靠位置的!

8 个解决方案

#1


http://msdn.microsoft.com/zh-cn/library/cc468230(v=vs.71).aspx

#2


引用 1 楼 huangcheng90 的回复:
http://msdn.microsoft.com/zh-cn/library/cc468230(v=vs.71).aspx


看过了,不过vc2008中新的窗体貌似不支持CControlBar了,定义的是CMFCToolBar,是从CWnd->CBasePane->CPane->CMFCBaseToolBar->继承过来的

我想解决的是设置 初始停靠位置的问题

   CFrameWnd::EnableDocking(CBRS_ALIGN_ANY)
和 CMFCToolBar::EnableDocking(CBRS_ALIGN_ANY)已经解决了 可以停靠的问题了,但是生成程序后 初始位置混乱,和create中填的参数不符

#3


需要删除注册表中的一些数据项

具体的在注册表中查询

#4


SetRegistryKey(_T("Local AppWizard-Generated Applications"));

在注册表中 查找SetRegistryKey(_T("……"));中的内容

#5


引用 3 楼 zxueh 的回复:
需要删除注册表中的一些数据项

具体的在注册表中查询


不懂了。。和注册表有关系么,指点下

#6


2008对于工具栏以及其他浮动工具具有记忆功能

这些都表现在注册表中

查看你的APP类InitInstance()函数有类似的函数
SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings();  // Load standard INI file options (including MRU)

在CMainFrame::OnCreate()中有LoadBarState(_T("ToolBarState"));

在其他退出函数中应该有 SaveBarState(_T("ToolBarState"));

说的比较笼统具体你可以查看MSDN

#7


md,折腾我好几天啊,想ms也没那么龊吧,还是找到方法了,在CMainFrame::OnActivate里,把你的barm_testBar.ShowWindow(SW_SHOW);就可以显示了,我测试的不是toolbar,是dockbar,不知道对你们是否适用。

#8


谢了  晓得了不少

#1


http://msdn.microsoft.com/zh-cn/library/cc468230(v=vs.71).aspx

#2


引用 1 楼 huangcheng90 的回复:
http://msdn.microsoft.com/zh-cn/library/cc468230(v=vs.71).aspx


看过了,不过vc2008中新的窗体貌似不支持CControlBar了,定义的是CMFCToolBar,是从CWnd->CBasePane->CPane->CMFCBaseToolBar->继承过来的

我想解决的是设置 初始停靠位置的问题

   CFrameWnd::EnableDocking(CBRS_ALIGN_ANY)
和 CMFCToolBar::EnableDocking(CBRS_ALIGN_ANY)已经解决了 可以停靠的问题了,但是生成程序后 初始位置混乱,和create中填的参数不符

#3


需要删除注册表中的一些数据项

具体的在注册表中查询

#4


SetRegistryKey(_T("Local AppWizard-Generated Applications"));

在注册表中 查找SetRegistryKey(_T("……"));中的内容

#5


引用 3 楼 zxueh 的回复:
需要删除注册表中的一些数据项

具体的在注册表中查询


不懂了。。和注册表有关系么,指点下

#6


2008对于工具栏以及其他浮动工具具有记忆功能

这些都表现在注册表中

查看你的APP类InitInstance()函数有类似的函数
SetRegistryKey(_T("Local AppWizard-Generated Applications"));

LoadStdProfileSettings();  // Load standard INI file options (including MRU)

在CMainFrame::OnCreate()中有LoadBarState(_T("ToolBarState"));

在其他退出函数中应该有 SaveBarState(_T("ToolBarState"));

说的比较笼统具体你可以查看MSDN

#7


md,折腾我好几天啊,想ms也没那么龊吧,还是找到方法了,在CMainFrame::OnActivate里,把你的barm_testBar.ShowWindow(SW_SHOW);就可以显示了,我测试的不是toolbar,是dockbar,不知道对你们是否适用。

#8


谢了  晓得了不少