我有一个CFrameWndEx
有多个停靠CDockablePanes
但是当停靠窗格的大小发生变化时我似乎无法得到通知(因此我可以相应调整其他窗口的大小)。尝试使用Spy ++来检查消息,但是自定义绘制似乎是唯一一个(这似乎不合适)并且还尝试重写RecalcLayout,但在这种情况下不会调用它。 OnSize
不起作用,因为框架本身的大小没有改变。有任何想法吗?
(Ps:我很确定这是可能的,因为我曾经有一个分离窗口作为'客户'区域,当窗格调整大小时它会神奇地调整大小)
答案 0 :(得分:3)
好的,这有点奇怪,但我有完全相同的问题,在谷歌搜索,然后看到我在一年前回答了这个问题,但完全误解了问题是什么:)
无论如何作为未来谷歌使用人的参考,这个问题的答案是覆盖虚拟无效CFrameWndEx :: EAdjustDockingLayout(HDWP hdwp)并在那里进行客户端控件的任何大小调整。要在隐藏/关闭/任何窗格之后获取客户区,请使用m_dockManager.GetClientAreaBounds()。我的AdjustDockingLayout看起来像这样(m_View是应该填充整个客户区域的子窗口,无论任何停靠窗格的状态如何,根据需要进行调整):
void CMainFrame::AdjustDockingLayout(HDWP hdwp)
{
CFrameWndEx::AdjustDockingLayout(hdwp);
if (m_View.GetSafeHwnd()) {
CRect rectUsable = m_dockManager.GetClientAreaBounds();
m_View.MoveWindow(rectUsable);
}
}
答案 1 :(得分:0)
我认为问题在于CFrameWndEx的'内容'本身就是一个窗口,并在该窗口中显示“主要内容”窗口。使用Spy ++检查窗口层次结构以及CFrameWndEx的任何子窗口(可停靠窗格除外)是否在调整大小时收到消息。基本上,当停靠窗格停靠时,CFrameWndEx会调整其子项的大小,因此您必须在那里检测它并且(如果需要)将消息反映回CFrameWndEx,如果这确实是您需要它的地方。
或者,也许我是误会,而且我正是在描述你正在尝试做什么。在这种情况下,我认为将窗口添加到CFrameWndEx的方式有问题,因为它应该处理调整大小本身。子窗口的父窗口在创建时是否正确设置为CFrameWndEx?