MFC:基于CControlBar创建水平或垂直定制的自定义工具栏

时间:2015-08-22 15:43:19

标签: c++ mfc docking

尝试使用垂直方向的 CControlBar 来源的自定义工具栏。大概没有结果,因为它始终是水平的或总是垂直的,或者我实际上并不知道 - 太多参数无法同步,我很害怕!

这是我到目前为止所得到的:

// creating the CControlBar-derived toolbar
CMyCB cb; // CControlBar-derived toolbar
cb.Create(  AfxRegisterWndClass(0),
        NULL,
        WS_CHILD | WS_VISIBLE ,
        CRect(0,0,100,100),
        AfxGetMainWnd(),
        0
);
cb.SetBarStyle( cb.GetBarStyle() | CBRS_LEFT | CBRS_SIZE_DYNAMIC | CBRS_GRIPPER );
cb.EnableDocking( CBRS_ORIENT_HORZ );

// in CFrameWnd-derived window constructor
this->EnableDocking( CBRS_ALIGN_ANY );
this->FloatControlBar( &cb, CPoint(100,100), CBRS_ALIGN_LEFT );
this->ShowControlBar( &cb, TRUE, FALSE );

通过在那里放置一个断点来观察 CControlBar :: CalcFixedLayout (在 CMyCB 中覆盖)是如何调用的,我可以看到它的 bHorz 参数(告知 cb 是否为水平或垂直工具栏)第一次调用时为“2”,后续第二次调用时为“0”。

我可以从中得出什么结论?有没有办法如何创建始终水平或始终垂直的自定义工具栏? (至少与 bHorz 参数一样)请参阅上面代码段中的参数 CBRS _ *。非常感谢。

托马斯

1 个答案:

答案 0 :(得分:0)

我从未得到一个工具栏,只需使用CreateEx调用设置就可以左右对齐。 Panes没问题。即使调试MFC代码的深度也没有告诉我原因。

所以这是我的简单解决方案。

m_wndHorzBar是要对齐左侧的栏的名称。我刚刚使用向导创建了一些示例代码,我希望您有一个普通的工具栏和一个菜单,以便您可以看到上下文。

// Create it (just for simplicity no error checking) 
// CBR_LEFT seamed to be ignored 
m_wndHorzBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

...

// Allow the normal bars to align anywhere
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
// this bar should be aligned only in the left docking area
m_wndHorzBar.EnableDocking(CBRS_ALIGN_LEFT);

// Perform the initial docking
EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndMenuBar);
DockPane(&m_wndToolBar);
DockPane(&m_wndHorzBar);

// Now allow the bar to be docked anywhere by the user
m_wndHorzBar.EnableDocking(CBRS_ALIGN_ANY);