将 CDialogBar 与 CToolbar 水平对接

Posted

技术标签:

【中文标题】将 CDialogBar 与 CToolbar 水平对接【英文标题】:Docking CDialogBar Horizontally with CToolbar 【发布时间】:2012-11-27 19:29:31 【问题描述】:

我需要水平显示一个 CToolbar (m_wndToolBar) 和一个 CDialogBar (m_wndDlgBarSid1)(即彼此相邻,而不是彼此上方)。父框架派生自 CMDIFrameWnd。

我已经尝试了各种变体来让它发挥作用。虽然我可以将 CDialogBar 正确定位到 CToolbar 的右侧,但我无法保持定位,尽管 WINDOWPLACEMENT 机制工作正常(注册表是在程序退出时编写的);每当程序运行时,CToolbar 显示在左侧停靠,CDialogBar 显示在其下方,也停靠在左侧。我正在使用(perforce)MFC 和 Visual C++ 6.0。这是代码,稍作修改以删除调试打印输出等:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

   if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
   
      return -1;
   
   if (!m_wndToolBar.Create(this) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) )
   
      return -1;      // fail to create
   
   if (!m_wndDlgBarSid1.Create(this, IDD_DIALOGBAR_SID1, CBRS_ALIGN_TOP, AFX_IDW_DIALOGBAR))
   
      return -1;        // fail to create
   

   WINDOWPLACEMENT wp ;
   CString sSection = "DialogBarSettings";
   CString sEntry = "Sid1";
   if ( ReadWindowPlacement( &wp, sSection, sEntry ))
   
      BOOL bSWP = m_wndDlgBarSid1.SetWindowPlacement( &wp );
      RecalcLayout();
   

   m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
   m_wndToolBar.GetToolBarCtrl().ModifyStyle( 0, TBSTYLE_FLAT, 0 ) ;
   m_wndDlgBarSid1.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY ) ;

   m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
   EnableDocking(CBRS_ALIGN_ANY);
   DockControlBar(&m_wndToolBar);

   m_wndDlgBarSid1.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
   DockControlBar(&m_wndDlgBarSid1,AFX_IDW_DOCKBAR_TOP);

   return 0;

有什么想法吗?

【问题讨论】:

Arrrg...我为格式化道歉;接口暗示它将被保留。 【参考方案1】:

在返回零之前粘贴下面的代码。这将加载之前保存的停靠状态。

CDockState dockState;
dockState.LoadState(L"CTRLBARSDOCKSTATE.INI");
SetDockState(dockState);
RecalcLayout();

要在窗口关闭时保存当前停靠状态,请将以下代码粘贴到 CMainFrame::OnClose() 覆盖中。

CDockState dockState;
GetDockState(dockState);
dockState.SaveState(L"CTRLBARSDOCKSTATE.INI");//File name can be of your choice

【讨论】:

【参考方案2】:

使用 CReBar 完成,非常接近我的需要。

【讨论】:

以上是关于将 CDialogBar 与 CToolbar 水平对接的主要内容,如果未能解决你的问题,请参考以下文章

CToolbar 是不是支持带有 32 位图标的按钮?

MFC:使用CTreeCtrl和CToolbar创建一个类(CWnd?)

如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?

MFC文档应用程序CToolBar:设置两个工具条并列停靠到同一条边上 转

CToolBar 是停靠还是浮动?

为啥在 CToolBar 中使用高深度颜色的禁用按钮只是灰色框?