记录:
2023.8.1
最终实现:
控制栏1停靠在窗口1右侧,
控制栏2停靠在窗口2右侧上方,
控制栏3停靠在窗口2右侧下方,
实现步骤:
1.定义三个控制栏1,2,3;
2.在OnCreate中使用Create创建控制并使用DockToFrameWindow来停靠控制栏窗口,
使用DockToWindow将控制栏3停靠在控制栏2下方;
3.创建一个工具栏窗口,并在其中添加按钮事件切换控制栏窗口显示;
4.在OnCreate初始化时调用工具栏中的方法来显示窗口,
显示控制栏使用函数ShowControlBar。
2023.8.2修正
按照上述的方法在显示窗口2时,控制栏3的高度不是预期的高度
经测试进行了一下修正:
- OnCreate中不调用DockToWindow对控制栏的顺序进行停靠
- 显示控制栏3时不使用ShowControlBar方法,通过调用DockToWindow就可以显示了
问题描述:
在SDI应用程序中使用BCGP创建了3个控制栏:
CBCGPDialogBar m_dlgbarRight1;
CBCGPDialogBar m_dlgbarRight2_1;
CBCGPDialogBar m_dlgbarRight2_2;
在主框架的OnCreate中创建并停靠显示:
//创建
if (!m_dlgbarRight1.Create (NULL, this,
FALSE,MAKEINTRESOURCE(IDD_DLG_RIGHTBAR1),WS_VISIBLE | WS_CHILD | CBRS_BOTTOM,IDD_DLG_RIGHTBAR1))
{
TRACE0("Failed to create right dialogbar\n");
return -1;
}
//.....另外两个略
//控制栏停靠主窗口
DockControlBar(&m_dlgbarRight1);
DockControlBar(&m_dlgbarRight2_1);
DockControlBar(&m_dlgbarRight2_2);
//控制栏3停靠在控制栏2下方
m_dlgbarRight2_2.DockToWindow(&m_dlgbarRight2_1, CBRS_BOTTOM);
//显示控制栏
m_dlgbarRight1.ShowControlBar(TRUE,FALSE,FALSE);
m_dlgbarRight2_1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_2.ShowControlBar(FALSE,FALSE,FALSE);
在工具栏(名称略)中添加按钮实现停靠窗口切换:
OnBtnClickedRightBar1()
{
//隐藏控制栏必须要写在显示控制栏之前,否则显示时窗口大小也会有问题
m_dlgbarRight2_1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_2.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight1.ShowControlBar(TRUE,FALSE,FALSE);
}
OnBtnClickedRightBar2()
{
m_dlgbarRight1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_1.ShowControlBar(TRUE,FALSE,FALSE);
m_dlgbarRight2_2.ShowControlBar(TRUE,FALSE,FALSE);
}
这是显示的第一个窗口:
控制栏:m_dlgbarRight1
这是显示的第二个窗口:
控制栏:m_dlgbarRight2_1,m_dlgbarRight2_2
从第一个窗口切换到第二个窗口时要显示的控制栏会自主变宽
解决方法:
在OnCreate中修改初始化停靠显示代码为:
//使用CBCGPDockingControlBar的函数将窗口停靠于主框架
m_dlgbarRight1.DockToFrameWindow(CBRS_RIGHT);
m_dlgbarRight2_1.DockToFrameWindow(CBRS_RIGHT);
m_dlgbarRight2_2.DockToFrameWindow(CBRS_RIGHT);
//这里先不调用DockToWindow来改变控制栏停靠位置
//m_dlgbarRight2_2.DockToWindow(&m_dlgbarRight2_1, CBRS_BOTTOM);
//显示控制栏
m_dlgbarRight1.ShowControlBar(TRUE,FALSE,FALSE);
m_dlgbarRight2_1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_2.ShowControlBar(FALSE,FALSE,FALSE);
在CMainFrm中定义两个方法来对控制栏窗口进行切换显示
void CMainFrame::ShowRightBar1()
{
m_dlgbarRight2_1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_2.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight1.ShowControlBar(TRUE,FALSE,FALSE);
}
void CMainFrame::ShowRightBar2()
{
m_dlgbarRight1.ShowControlBar(FALSE,FALSE,FALSE);
m_dlgbarRight2_1.ShowControlBar(TRUE,FALSE,FALSE);
//通过DockToWindow方法来显示控制栏m_dlgbarRight2_2
m_dlgbarRight2_2.DockToWindow(&m_dlgbarRightDebug, CBRS_BOTTOM);
//m_dlgbarRight2_2.ShowControlBar(TRUE,FALSE,FALSE);
}
经过以上修改就会神奇的发现,停靠窗口可以按照自己想要的大小来显示了.
猜测原因大概和窗口显示过程中一系列重载函数的调用顺序有关