MFC控制条窗口布局原理(上)

本文详细解析了MFC中框架窗口的布局原理,重点介绍了RepositionBars函数的作用,以及WM_SIZEPARENT消息如何在框架窗口与控制条子窗口间传递,涉及到FWS_SNAPTOBARS风格的影响和多线程下的重入问题。同时,文章讨论了CDockBar和CControlBar在处理布局时的机制,包括动态和静态布局的计算。
摘要由CSDN通过智能技术生成
 
MFC 控制条窗口布局原理
——by Koote Bi@fudan cse
一、框架窗口
让我们先从框架窗口开始。当框架窗口改变大小时会收到 WM_SIZE 消息, CFrameWnd::OnSize负责处理此消息 ,该函数调用 RecalcLayout 来重新安置各子窗口,它的主体代码如下:
if(GetStyle() & FWS_SNAPTOBARS)
{
CRect rect(0, 0, 32767, 32767);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &rect, &rect, FALSE);
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra, &m_rectBorder, &rect, TRUE);
CalcWindowRect(&rect);
SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
}
else
{
        RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposExtra, &m_rectBorder);
}
这里有两个小的地方要注意,第一是 FWS_SNAPTOBARS 风格。一般来说,都是框架窗口主动改变大小,子窗口随之要修改自己来适应框架窗口的改变,但是这个 FWS_SNAPTOBARS 风格却相反,是让框架窗口改变大小来适应它的子窗口, 这个风格是为 CMiniDockFrameWnd 准备的,这个框架窗口的大小是根据它内部的控制条来定的;第二是要注意 RecalcLayout 是不可重入的, MFC 防止重入的方法虽然非常的简单有效,但是它的方法要不能防止多线程的重入 —— 话说回来 MFC 本身就不是一个线程安全的库。
好了现在我们进入了整个重布局动作的主体函数 RepositionBars (这个函数在 MSDN 里有文档记载,关于它的几个参数的含义就不在这里赘述了):
首先,它创建一个
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值