【问题标题】:MFC: How does a FrameWnd know when a docked pane is resized?MFC:FrameWnd 如何知道停靠窗格何时调整大小?
【发布时间】:2012-04-10 22:03:48
【问题描述】:

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

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

【问题讨论】:

    标签: mfc


    【解决方案1】:

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

    无论如何,作为未来谷歌用户的参考,这个问题的答案是覆盖 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);
        }
    }
    

    【讨论】:

    • 这比我现在得到的有了明显的改进,并解决了所描述的特定问题(通知问题)。但是,此处显示的代码在我的应用程序中不起作用,因为它“感觉”对接管理器在调用时尚未“解决”。因此,当我将工具栏停靠在主窗口内时,它无法正确绘制。如果我将 GetClientAreaBounds 和 MoveWindow 分离为从此函数触发的计时器回调,那么它“工作”。
    • 我也有一些重绘问题,在我的情况下,从窗格所在的 CDockablePane 中删除 WS_CLIPCHILDREN 解决了​​它。基本上在我的 CMainFrame::OnCreate 中,我执行以下操作:DockPane(&m_Pane1); CDockablePane* pTabbedBar = NULL; m_Pane2.AttachToTabWnd(&m_Pane1, DM_SHOW, TRUE, &pTabbedBar); pTabbedBar->ModifyStyle(WS_CLIPCHILDREN, 0);
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 2021-02-08
      • 2011-10-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多