2012-04-10 102 views
3

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

(PS:我敢肯定这是可能的,因为我曾经有一个拆分窗口的“客户”区域,它会神奇地调整自己当窗格被调整)

回答

3

OK,这是一个有点怪异,但我有相同的问题,搜索谷歌,然后看到我已经在一年前回答这个问题,但完全误解的问题是怎么样:)

不管怎么说以供未来的谷歌使用的人参考,这个问题的答案是覆盖虚拟无效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); 
    } 
} 
+0

这是在什么我有一个明确的改善现在得到了,并解决了所描述的具体问题(即通知)。然而,这里显示的代码在我的应用程序中不起作用,因为它'觉得'对接管理器在这个被调用的位置还没有'解决'。所以当我停靠在主窗口的工具栏时,它不能正确绘制。如果我将GetClientAreaBounds和MoveWindow分隔成由此函数触发的定时器回调,那么它“起作用”。 – hunter 2013-06-14 17:27:09

+0

我也有一些重绘问题,在我的情况下,从窗口所在的CDockablePane中移除WS_CLIPCHILDREN来解决它。基本上在我的CMainFrame :: OnCreate中,我执行以下操作:DockPane(&m_Pane1); CDockablePane * pTabbedBar = NULL; (&m_Pane1,DM_SHOW,TRUE,&pTabbedBar); pTabbedBar-> ModifyStyle(WS_CLIPCHILDREN,0); – Roel 2013-07-17 13:57:57

0

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

另外,也许我误解了,而我正是描述了你正在尝试做什么。在那种情况下,我认为将窗口添加到CFrameWndEx的方式有些问题,因为它应该处理调整大小本身。当您创建子窗口的父窗口时是否正确设置了CFrameWndEx?

相关问题