[原创]MFC分割窗口后如何去掉子窗口滚动条

原址:http://hi.baidu.com/kuliuheng/blog/item/d5cecd1cd8388d1834fa4145.html

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

就像这样:


       想来想去,感觉左边这个子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这个函数(个人体会)。



  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值