滚动条难处理的就是它的消息及滚动窗口,该代码能够运行,有需要的朋友可以拿去用或参考。
1. 创建滚动条
SCROLLINFO info;
ZeroMemory( &info, sizeof(SCROLLINFO) );
GetScrollInfo( SB_VERT, &info );
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = m_vFileItem.size()*100;
info.nPage =y1-30;
info.nPos = 0;
SetScrollInfo( SB_VERT, &info, TRUE );
m_bVScroll=true; //在Onsize中使用
2. 滚动条消息处理
void CFileTransDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int nDelta;
int nMaxPos = m_vFileItem.size()*100;
switch (nSBCode)
{
case SB_LINEDOWN:
if(m_nScrollPos + m_nCurHeight>= nMaxPos)
return;
nDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos);
break;case SB_LINEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(max(nMaxPos/20,5),m_nScrollPos);
break;
case SB_PAGEDOWN:
if (m_nScrollPos >= nMaxPos)
return;
nDelta = min(max(nMaxPos/10,5),nMaxPos-m_nScrollPos);
break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
nDelta = (int)nPos - m_nScrollPos;
break;
case SB_PAGEUP:
if (m_nScrollPos <= 0)
return;
nDelta = -min(max(nMaxPos/10,5),m_nScrollPos);
break;
default:
return;
}
m_nScrollPos += nDelta;
SetScrollPos(SB_VERT,m_nScrollPos,TRUE);
ScrollWindow(0,-nDelta);CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}3. OnSize 消息处理
void CFileTransDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
m_nCurHeight = cy;if(m_bVScroll)
{
SCROLLINFO info;
ZeroMemory( &info, sizeof(SCROLLINFO) );
GetScrollInfo( SB_VERT, &info );
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = m_vFileItem.size()*100;
info.nPage =cy-30;
info.nPos = 0;
SetScrollInfo( SB_VERT, &info, TRUE );
}
}