MFC:FrameWnd如何知道何时调整停靠窗格的大小?

时间:2012-04-10 22:03:49

标签: mfc

我有一个CFrameWndEx有多个停靠CDockablePanes但是当停靠窗格的大小发生变化时我似乎无法得到通知(因此我可以相应调整其他窗口的大小)。尝试使用Spy ++来检查消息,但是自定义绘制似乎是唯一一个(这似乎不合适)并且还尝试重写RecalcLayout,但在这种情况下不会调用它。 OnSize不起作用,因为框架本身的大小没有改变。有任何想法吗?

(Ps:我很确定这是可能的,因为我曾经有一个分离窗口作为'客户'区域,当窗格调整大小时它会神奇地调整大小)

2 个答案:

答案 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?