Loading

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

posted @ 2017-07-01 18:54  leon_x  阅读(65)  评论(0)    收藏  举报