问题是这样的,当滚动条初始位置不变时,上下调整界面大小,不会有问题,如果把滚动条拖到下面,然后再把界面的上边界向上拉,则界面的上面会有一部分丢失,无法显示了(应该是跑到上面去了,显示不了),应该是逻辑上的问题,但我不清楚错在哪,下面是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;
}
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;
}
你看就知道了:
http://www.codeproject.com/KB/dialog/scrolling_support.aspx
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);