关于窗口的停靠顺序

快乐鹦鹉 2011-03-11 10:03:35
当我们使用VC6进行debug程序时,会发现debug窗口停靠在底部,并且占用了整个底部空间,此时VC左侧的classview窗口会被挤到debug窗口的上方。
这个现象好像是VC默认的,我现在的程序中也分别增加了右侧和底部停靠窗口,两者的效果与VC进行debug时一样,总是底部的停靠窗口占用了整个底部。但这不是我需要的效果。我想要的是右侧的停靠窗口占用整个右侧,而将底部的停靠窗口向左边挤。
从我的理解,这好像是个顺序问题,目前总是先停放横向的,再停放纵向的,即时我在主窗口中把两个窗口的dock顺序调整了也是一样的效果。哪位知道如何调整才能实现我想要的效果呢?

以下是MainFrame中我的两个控制面板的创建方式:
////////////创建属性浮动窗//////////
m_wndVFloatPanel.Create(this,&m_VFloatPanelDlg,CString("垂直属性面板"),IDD_FLOAT_PANEL,WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_ORIENT_VERT | CBRS_SIZE_DYNAMIC);
m_wndVFloatPanel.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);
DockControlBar(&m_wndVFloatPanel,AFX_IDW_DOCKBAR_RIGHT);
ShowControlBar(&m_wndVFloatPanel,FALSE,FALSE);

////////////创建属性浮动窗//////////
m_wndHFloatPanel.Create(this,&m_HFloatPanelDlg,CString("水平属性面板"),IDD_FLOAT_PANEL,WS_CHILD | WS_VISIBLE | CBRS_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_ORIENT_HORZ | CBRS_SIZE_DYNAMIC);
m_wndHFloatPanel.EnableDocking(CBRS_ALIGN_BOTTOM|CBRS_ALIGN_TOP);
DockControlBar(&m_wndHFloatPanel,AFX_IDW_DOCKBAR_BOTTOM);
ShowControlBar(&m_wndHFloatPanel,FALSE,FALSE);
我先创建垂直面板,然后停靠右侧,再创建水平面板,然后停靠底部,结果还是底部的优先占用了空间。郁闷啊。
...全文
565 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-04-02
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
向立天 2011-03-12
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 happyparrot 的回复:]

仔细看了一下,你的代码有点狠,就简单的强行调整了一下显示顺序......
[/Quote]大版
我研究了一天
可能就38楼的方法能解决问题
他的代码出处应该是这篇文章
不知你看没看过
http://hi.baidu.com/shi51314/blog/item/d5646409199951a82fddd426.html
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
成功了? 村委?
wwgddx 2011-03-11
  • 打赏
  • 举报
回复
wwgddx 2011-03-11
  • 打赏
  • 举报
回复
大板是不是这个效果?
http://hi.csdn.net/attachment/201103/11/142639_1299818950AAdf.jpg

用我的代码加在mainframe ONCREATE里面
#include <afxpriv.h>
快乐鹦鹉 2011-03-11
  • 打赏
  • 举报
回复
是吗?我也看看。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
大版, 我觉得和你用的CCoolDialogBar的CalcDynamicLayout计算方法有关系。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
这个问题果然很难啊, 呵呵, 看了下vc6的耶是这样的停靠。 汗。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 happyparrot 的回复:]

引用 21 楼 muzizongheng 的回复:
也可以自己封装个函数, 大版试试


C/C++ code

DockControlBarNextTo()


void CMainFrame::DockControlBarNextTo(CControlBar* pBar,
CControlBar* pTargetBar)
{
ASSERT(……

测试了一下,你这……
[/Quote]

调了快一个小时, 没搞定。 汗。

我再看看
快乐鹦鹉 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 muzizongheng 的回复:]
也可以自己封装个函数, 大版试试


C/C++ code

DockControlBarNextTo()


void CMainFrame::DockControlBarNextTo(CControlBar* pBar,
CControlBar* pTargetBar)
{
ASSERT(……
[/Quote]
测试了一下,你这个函数把两个面板都放到同一侧了......
shenyi0106 2011-03-11
  • 打赏
  • 举报
回复
好多兔子哈……
大家一起逮兔子
Eleven 2011-03-11
  • 打赏
  • 举报
回复
兔子党的兄弟真给力~
快乐鹦鹉 2011-03-11
  • 打赏
  • 举报
回复
党主任的办法我稍后试试。
demo在http://download.csdn.net/source/3082209
请大家帮忙调整顺序。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
也可以自己封装个函数, 大版试试


DockControlBarNextTo()


void CMainFrame::DockControlBarNextTo(CControlBar* pBar,
CControlBar* pTargetBar)
{
ASSERT(pBar != NULL);
ASSERT(pTargetBar != NULL);
ASSERT(pBar != pTargetBar);

// the neighbour must be already docked
CDockBar* pDockBar = pTargetBar->m_pDockBar;
ASSERT(pDockBar != NULL);
UINT nDockBarID = pTargetBar->m_pDockBar->GetDlgCtrlID();
ASSERT(nDockBarID != AFX_IDW_DOCKBAR_FLOAT);

bool bHorz = (nDockBarID == AFX_IDW_DOCKBAR_TOP ||
nDockBarID == AFX_IDW_DOCKBAR_BOTTOM);

// dock normally (inserts a new row)
DockControlBar(pBar, nDockBarID);

// delete the new row (the bar pointer and the row end mark)
pDockBar->m_arrBars.RemoveAt(pDockBar->m_arrBars.GetSize() - 1);
pDockBar->m_arrBars.RemoveAt(pDockBar->m_arrBars.GetSize() - 1);

// find the target bar
for (int i = 0; i < pDockBar->m_arrBars.GetSize(); i++)
{
void* p = pDockBar->m_arrBars[i];
if (p == pTargetBar) // and insert the new bar after it
pDockBar->m_arrBars.InsertAt(i + 1, pBar);
}

// move the new bar into position
CRect rBar;
pTargetBar->GetWindowRect(rBar);
rBar.OffsetRect(bHorz ? 1 : 0, bHorz ? 0 : 1);
pBar->MoveWindow(rBar);
}


Here is an example:

DockControlBar(&m_wndVFloatPanel, AFX_IDW_DOCKBAR_LEFT);
DockControlBar(&m_wndHFloatPanel, AFX_IDW_DOCKBAR_BOTTOM);
DockControlBarNextTo(&m_wndHFloatPanel, &m_wndVFloatPanel);

向立天 2011-03-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 happyparrot 的回复:]

感谢大家这么热心,基类是CControlBar
我正在准备demo。不过手头事太多,大家稍等。
[/Quote]
不急
实践出真知
快乐鹦鹉 2011-03-11
  • 打赏
  • 举报
回复
感谢大家这么热心,基类是CControlBar
我正在准备demo。不过手头事太多,大家稍等。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
调用enable后 ,就调用DockControlBar统一布局。 代码在上面。
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
DockControlBar(&m_wndVFloatPanel, AFX_IDW_DOCKBAR_LEFT);
RecalcLayout();
CRect rect;
m_wndVFloatPanel.GetWindowRect(rect);
rect.OffsetRect(1, 0);//偏移一个位置
DockControlBar(&m_wndHFloatPanel, AFX_IDW_DOCKBAR_BOTTOM,rect);
wwgddx 2011-03-11
  • 打赏
  • 举报
回复
大板,我的代码,请参考,这是设置上下左右工具栏停靠的模式的, 不知道是不是你要的
CDockBar* pDockTOP = (CDockBar*)GetControlBar(AFX_IDW_DOCKBAR_TOP);
pDockTOP->SetBarStyle(pDockTOP->GetBarStyle() & ~(CBRS_BORDER_ANY));
CDockBar* pDockLEFT = (CDockBar*)GetControlBar(AFX_IDW_DOCKBAR_LEFT);
pDockLEFT->SetBarStyle(pDockLEFT->GetBarStyle() & ~(CBRS_BORDER_ANY));

CDockBar* pDockBarBottom = (CDockBar*)GetControlBar(AFX_IDW_DOCKBAR_BOTTOM);
CDockBar* pDockBarRight = (CDockBar*)GetControlBar(AFX_IDW_DOCKBAR_RIGHT);
pDockBarBottom->SetWindowPos(pDockBarRight,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
pDockBarBottom->SetBarStyle(pDockBarBottom->GetBarStyle() & ~(CBRS_BORDER_ANY));
pDockBarRight->SetBarStyle(pDockBarRight->GetBarStyle() & ~(CBRS_BORDER_ANY));
muzizongheng 2011-03-11
  • 打赏
  • 举报
回复
我觉得2次调用应该就解决了。

先调用panel的enableDocking, 说明能停靠哪些边,
然后调用frame的enableDocking, 这时就有顺序问题了。 先停靠的先划分rect。
加载更多回复(22)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧