问题是这样的,当滚动条初始位置不变时,上下调整界面大小,不会有问题,如果把滚动条拖到下面,然后再把界面的上边界向上拉,则界面的上面会有一部分丢失,无法显示了(应该是跑到上面去了,显示不了),应该是逻辑上的问题,但我不清楚错在哪,下面是OnSize函数里的代码,看看哪部分逻辑有问题:
LRESULT CScroll::OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
// TODO: Add your message handler code here and/or call default int nPos = GetScrollPos(SB_VERT);
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
if (y < m_rScroll.Height())      //m_rScroll是在OnInitDialog函数里通过GetWindowRect获取的
{
ShowScrollBar(SB_VERT);
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = m_rScroll.Height();
info.nPage = y;
info.nPos = nPos;
SetScrollInfo(SB_VERT, &info);
SetScrollPos(SB_VERT, nPos);
}
else
{
SetScrollPos(SB_VERT, 0);
ShowScrollBar(SB_VERT, false);
ScrollWindow(0, m_nScrollPos);    //m_nScrollPos记录的是滚动的位移,在OnVScroll获取的
}
return 0;
}

解决方案 »

  1.   

    补充一下,即便调整的高度没有超过整个显示内容的高度(没有进入到else部分),也会发生界面丢失的情况。
      

  2.   

    呵呵,主要是ScrollWindow滚多了或者滚少了,还有设置滚动信息不对,给你个滚动条帮助类
    你看就知道了:
    http://www.codeproject.com/KB/dialog/scrolling_support.aspx
      

  3.   

    把OnSize改成这样子,应该容易看一些,不过也有问题
    int nPos = GetScrollPos(SB_VERT);
    int x = GET_X_LPARAM(lParam);
    int y = GET_Y_LPARAM(lParam);
    SCROLLINFO info;
    info.cbSize = sizeof(SCROLLINFO);
    info.fMask = SIF_ALL;
    info.nMin = 0;
    info.nMax = m_rVertScroll.Height();
    info.nPage = y;
    if (y < m_rVertScroll.Height())
    {
    info.nPos = nPos;
    }
    else
    {
    info.nPos = 0;
    ScrollWindow(0, m_nScrollPos);
    }
    SetScrollInfo(SB_VERT, &info);
      

  4.   

    在OnSize里没有运行到ScrollWindow时也会出现界面丢失的情况。