【交互】MFC窗口位置分析

本文探讨了MFC中的单文档子窗口和多视图的布局管理。在单文档子窗口中,OnSize()通过WM_SIZEPARENT消息调整CControlBar和View类的位置。在单文档多视图场景下,窗口位置的排列涉及到多级窗口和SplitterWnd的重排机制。RecalcLayout()函数在布局管理中起关键作用,同时引用了多个MFC布局原理的参考资料。

一、单文档子窗口 
        OnSize()中通过发送WM_SIZEPARENT消息给子窗口,对于单文档而言,子窗口是CControlBar的派生类和视图View类,ControlBar的子窗口切去自己占有的矩形区,并用::EndDeferWindowPos()来设置,设置之后,对于还有有子窗体,会发送WM_WINDOWPOSCHANGED和WM_SIZE,通知下面的子窗体。

CDocTemplate::InitialUpdateFrame()
ActivateFrame(1)//里面调用了一个ShowWindow,显示所有窗口,发送WM_SIZE消息
CFrameWnd::OnSize()//CMainFrame收到WM_SIZE,交给CFrameWnd::OnSize()处理
{
  if (nType != SIZE_MINIMIZED)
  RecalcLayout();//调用CFrameWnd::RecalcLayout()
  {
       RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra, &m_rectBorder);//AFX_IDW_PANE_FIRST是作为最后一个窗口,占据剩余的空间来安排窗口位置。
       {
    ::GetTopWindow(m_hWnd)、::GetNextWindow()分别获取子窗体、兄弟窗体,发送WM_SIZEPARENT消息
       }
      AfxRepositionWindow(&layout, hWndLeftOver, &layout.rect);//放置最后一个窗口,hWndLeftOver是上面遍历所有窗口之后,最后一个id = AFX_IDW_PANE_FIRST的窗口
  }
}
//RepositionBars(0, 0xffff, AFX_IDW_PAN
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值