MFC分割窗口后如何去掉子窗口滚动条

转自http://hi.baidu.com/kuliuheng/item/dd4682f6f86a430ed89e72f8

       这是一个困扰了我很久的问题,也许我是因为我没有认真的去想这个问题吧——当分割了单文档窗口之后,改变左子窗口大小总会出现一个滚动条,甚是奇怪!

就像这样:


       想来想去,感觉左边这个子View里面似乎有一个隐藏着的小View,当外框比这个“隐藏view”更小的时候,滚动条就自动出现了~~我的感觉没错,在左边这个视图类CMessageListView中,我这样自定义了WM_SIZE响应函数:void CMessageListView::OnSize(UINT nType, int cx, int cy) {

    CRect rect;
     GetClientRect(&rect); // 获取当前客户区view大小
     CSize size = GetTotalSize();  // 获取scroll view的总大小
     rect.right = rect.left + size.cx; // 根据scroll view大小重新确定当前view大小
     rect.bottom = rect.top + size.cy;

     if (m_listBox != NULL)
     {
         m_listBox->MoveWindow(&rect, TRUE); // 将自定义的ListBox布满整个view区域
     }

}       我立马发现,视图成了这个样子:        看~!左边的视图中看到很诡异的情况——view在左边frame中缩成一小块儿了,这就证明了我的猜想是正确的,原来看似满屏的view内部,实际上包含的是一个小的scroll view在里面。进一步研究发现,原来这个区域的大小,是由控件Dialog的大小决定的。当鼠标调整了左边frame大小时,只要比这个隐藏view更小,那么就有滚动条出现了。       那么,如何让这个view跟随着frame的大小改变而改变呢?       查看MSDN可以发现,CScrollView::SetScrollSizes 可以担此重任(我是这么找到的,既然GetTotalSize能够获得整个scroll view大小,那么一定有一个与之相关的方法可以更改scroll view大小)。将上面的代码改成这样:

void CMessageListView::OnSize(UINT nType, int cx, int cy)
{
      CFormView::OnSize(nType, cx, cy);
      CRect rect;
      GetClientRect(&rect); // 获取当前客户区view大小

      CSize size;
      size.cx = rect.right - rect.left;
      size.cy = rect.bottom - rect.top;
      SetScrollSizes(MM_HIMETRIC, size); // 将CScrollView的大小设置为当前客户区大小
      if (m_listBox != NULL)
      {
          m_listBox->MoveWindow(&rect, TRUE);
      }
}

       效果如下:


       看,即使是左边frame缩小到这么小,也不会出现滚动条了。这个问题虽然不大,但是困扰了我很久,在网上竟然没有找到相关的文章,就连获取内部View 大小的方法,很少人用GetTotalSize这个方法,都说使用GetClientRect函数。这两者的区别我就不多说了,其实,只有在使用自定义的Form view 时才需要用到GetTotalSize这个函数(个人体会)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值