MFC实现连连看四:滚动条的使用
在实现连连看游戏的帮助功能时,遇到了滚动条的问题,要实现垂直滚动条,必须要自己重写两个函数,一个是OnSize()方法,确定滚动条的大小,还有一个是OnVScroll(),垂直滚动条的移动问题,如果不重写这两个方法,只是简单地将滚动条加到窗口上,会发现滚动条不起作用,而且将滚动条拉到下面之后会自己回到顶部,下面是关于这两个方法的具体实现:
void CHelp::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
//设置滚动条范围
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE;
si.nMin = 0;
si.nMax = 998;
si.nPage = cx;
//SetScrollInfo(SB_HORZ, &si, TRUE); // 添加水平滚动条
si.nMax = 496;
si.nPage = cy;
SetScrollInfo(SB_VERT, &si, TRUE); // 添加垂直滚动条
int icurxpos = GetScrollPos(SB_HORZ);
int icurypos = GetScrollPos(SB_VERT);
if (icurxpos < m_ixoldpos || icurypos < m_iyoldpos)
{
ScrollWindow(m_ixoldpos - icurxpos, 0);
ScrollWindow(0, m_iyoldpos - icurypos);
}
m_ixoldpos = icurxpos;
m_iyoldpos = icurypos;
Invalidate(TRUE);
}
void CHelp::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
static int oldpos = 0;
int minpos = 0;
int maxpos = 0;
GetScrollRange(SB_VERT, &minpos, &maxpos);
maxpos = GetScrollLimit(SB_VERT);
// 获取滚动条现在的位置
int curpos = GetScrollPos(SB_VERT);
// 确定滚动条的新位置
switch (nSBCode)
{
case SB_TOP:
curpos = minpos;
break;
case SB_BOTTOM:
curpos = maxpos;
break;
case SB_ENDSCROLL:
break;
case SB_LINEUP:
if (curpos > minpos)
curpos--;
break;
case SB_LINEDOWN:
if (curpos < maxpos)
curpos++;
break;
case SB_PAGEUP:
{
SCROLLINFO info;
GetScrollInfo(SB_VERT, &info, SIF_ALL);
if (curpos > minpos)
curpos = max(minpos, (curpos - (int)info.nPage));
}
break;
case SB_PAGEDOWN:
{
SCROLLINFO info;
GetScrollInfo(SB_VERT, &info, SIF_ALL);
if (curpos < maxpos)
curpos = min(maxpos, curpos + (int)info.nPage);
}
break;
case SB_THUMBPOSITION:
curpos = nPos;
break;
case SB_THUMBTRACK:
curpos = nPos;
break;
}
SetScrollPos(SB_VERT, curpos);
ScrollWindow(0, oldpos - curpos);
oldpos = curpos;
UpdateWindow();
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
完整源码已上传至我的GitHub:https://github.com/StriverLi/MFC—based-Lianliankan-game

浙公网安备 33010602011771号