关于侧边由上下两部分组成的停靠控制栏在切换时窗口大小的问题

记录:
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的高度不是预期的高度
经测试进行了一下修正:

  1. OnCreate中不调用DockToWindow对控制栏的顺序进行停靠
  2. 显示控制栏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);
}

经过以上修改就会神奇的发现,停靠窗口可以按照自己想要的大小来显示了.

猜测原因大概和窗口显示过程中一系列重载函数的调用顺序有关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值