我有CFrameWndEx
几个停靠CDockablePanes
但我似乎无法在停靠窗格的大小发生更改时收到通知(因此我可以相应地调整其他窗口的大小)。尝试 Spy++ 检查消息,但自定义绘图似乎是唯一的(这似乎不合适)并且还尝试覆盖 RecalcLayout,但在这种情况下不会调用。 OnSize
不起作用,因为框架本身的大小没有改变。有任何想法吗?
(Ps:我很确定这是可能的,因为我曾经有一个拆分窗口作为“客户”区域,当窗格调整大小时它会神奇地调整自己的大小)
我有CFrameWndEx
几个停靠CDockablePanes
但我似乎无法在停靠窗格的大小发生更改时收到通知(因此我可以相应地调整其他窗口的大小)。尝试 Spy++ 检查消息,但自定义绘图似乎是唯一的(这似乎不合适)并且还尝试覆盖 RecalcLayout,但在这种情况下不会调用。 OnSize
不起作用,因为框架本身的大小没有改变。有任何想法吗?
(Ps:我很确定这是可能的,因为我曾经有一个拆分窗口作为“客户”区域,当窗格调整大小时它会神奇地调整自己的大小)
好吧,这有点奇怪,但我有完全相同的问题,在谷歌上搜索,然后看到我在一年前回答了这个问题,但完全误解了这个问题的含义:)
无论如何,为了参考未来的谷歌用户,这个问题的答案是覆盖 virtual void 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);
}
}
我认为问题在于 CFrameWndEx 的“内容”本身就是一个窗口,并且在该窗口中存在“主要内容”窗口。使用 Spy++ 检查窗口层次结构,以及 CFrameWndEx 的任何子窗口(可停靠窗格除外)是否在调整大小时收到消息。基本上,当停靠窗格停靠时,CFrameWndEx 会调整其子项的大小,因此您必须在那里检测它并(如果需要)将消息反射回 CFrameWndEx(如果确实需要它)。
或者,也许我误解了,这正是我描述的你想要做的事情。在这种情况下,我认为将窗口添加到 CFrameWndEx 的方式有问题,因为它应该自己处理调整大小。创建时子窗口的父级是否正确设置为 CFrameWndEx?