使用CToolbar水平对接CDialogBar

时间:2012-11-27 19:29:31

标签: windows visual-c++ vc6

我需要水平显示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;
}

有什么想法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用CReBar,这非常接近我所需要的。