转自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区域
}
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这个函数(个人体会)。