5

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

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

4

2 回答 2

3

好吧,这有点奇怪,但我有完全相同的问题,在谷歌上搜索,然后看到我在一年前回答了这个问题,但完全误解了这个问题的含义:)

无论如何,为了参考未来的谷歌用户,这个问题的答案是覆盖 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);
    }
}
于 2013-06-08T12:21:32.460 回答
0

我认为问题在于 CFrameWndEx 的“内容”本身就是一个窗口,并且在该窗口中存在“主要内容”窗口。使用 Spy++ 检查窗口层次结构,以及 CFrameWndEx 的任何子窗口(可停靠窗格除外)是否在调整大小时收到消息。基本上,当停靠窗格停靠时,CFrameWndEx 会调整其子项的大小,因此您必须在那里检测它并(如果需要)将消息反射回 CFrameWndEx(如果确实需要它)。

或者,也许我误解了,这正是我描述的你想要做的事情。在这种情况下,我认为将窗口添加到 CFrameWndEx 的方式有问题,因为它应该自己处理调整大小。创建时子窗口的父级是否正确设置为 CFrameWndEx?

于 2012-04-11T15:13:15.023 回答