2.4 滚动条(Scroll Bar)使用实例

滚动条控件通常用于一些类似于对话框之类的容器控件中,当父窗口显示不下子窗口中的内容时,可以通过滚动条控件使子窗口内容在父窗口中滚动,以扩展父窗口的显示范围;

2.4.1 技术要点:

  • 当一个窗口上的滚动条发生滚动事件时,垂直方向的滚动条会向父窗口发送“WM_VSCROLL”消息,水平方向的滚动条控件会向父窗口发送“WM_HSCROLL”消息;
  • 要控制滚动条,可以向其发送Windows中预先定义的消息,这些消息都以“SBM_ ”开头。例如“SBM_GETPOS”消息用于获取指定滚动条的滑块当前位置;
  • 在 MFC 中,滚动条控件的封装类为 CScrollBar 。该类通过对上述消息的封装,将常用消息封装为方法,通过调用该类的相关方法,即可方便地控制控件;

2.4.2 实例步骤:

本实例通过一个显示滚动条当前位置的程序,演示滚动条的基本方法,实例步骤如下:

  1. 新建一个基于对话框的 MFC 应用程序,项目名称为“ScrollBarDemo”;2.4 滚动条(Scroll Bar)使用实例_第1张图片
  2. 在主对话框上添加一个水平滚动条控件,将控件的ID修改为“IDC_SCROLL”,并通过类向导,在主对话框类中为控件添加一个控件型变量,变量名称为“m_scroll”;2.4 滚动条(Scroll Bar)使用实例_第2张图片2.4 滚动条(Scroll Bar)使用实例_第3张图片
  3. 在主对话框上添加一个ID为“IDC_POS”的静态文本控件,用于显示滚动条滑块当前位置,并将控件的“Caption”属性清空;2.4 滚动条(Scroll Bar)使用实例_第4张图片
  4. 在主对话框类的 OnInitDialog 事件中,添加如下所示的初始化代码;
BOOL CScrollBarDemoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    //初始化滚动条控件
    SCROLLINFO si = {0};
    si.cbSize = sizeof(si);
    //要设置控件的滚动范围和每页大小
    si.fMask = SIF_RANGE | SIF_PAGE;
    //最小值为0
    si.nMin = 0;
    //最大值为100
    si.nMax = 100;
    //每页大小为10
    si.nPage = 10;
    //将信息设置到控件
    m_scroll.SetScrollInfo(&si);
    return TRUE;  // return TRUE  unless you set the focus to a control
}

5.通过类向导为主对话框添加“WM_HSCROLL”消息的响应函数,并将函数代码修改为如下所示:2.4 滚动条(Scroll Bar)使用实例_第5张图片

void CScrollBarDemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
    //取得滚动条控件当前状态
    SCROLLINFO si = {0};
    si.cbSize = sizeof(si);
    si.fMask = SIF_ALL;
    pScrollBar->GetScrollInfo(&si);
    int nNewPos = si.nPos;
    //处理消息
    switch(nSBCode)
    {
    //用户拖动了滚动条,参数nPos即是滑块的新位置
    case SB_THUMBTRACK:
        nNewPos = nPos;
        break;
    //单击了左箭头,滑块位置向左移动一个单元
    case SB_LINELEFT:
        nNewPos -= 1;
        break;
    //单击了右箭头,滑块位置向右移动一个单元
    case SB_LINERIGHT:
        nNewPos += 1;
        break;
    //向左翻页
    case SB_PAGELEFT:
        nNewPos -= si.nPage;
        break;
    //向右翻页
    case SB_PAGERIGHT:
        nNewPos += si.nPage;
        break;
    default:
        break;
    }
    //将新位置设置到控件
    if(nNewPos > si.nMax)
        nNewPos = si.nMax;
    if(nNewPos < si.nMin)
        nNewPos = si.nMin;
    pScrollBar->SetScrollPos(nNewPos);
    //显示新位置
    TCHAR szOutput[128] = {0};
    _stprintf(szOutput, _T("当前:%d"), nNewPos);
    SetDlgItemText(IDC_POS, szOutput);
}

2.4.3 程序运行:

按F5键运行程序,使用不同方法改变滚动条控件滑块的位置,程序都能正确响应并得到新位置。程序运行结果如图所示:2.4 滚动条(Scroll Bar)使用实例_第6张图片

2.4.4 源程序解读:

  • 通过本实例代码可以看出,在滚动条滑块位置被改变时,系统并不会自动移动滚动条,而是需要在程序中通过代码将滑块移动到合适的位置,否则在鼠标松开时,滑块会自行回到原位置;
  • 滚动控件的通知消息含义较复杂,需要针对传递来的不同参数做出不同处理,以免发生错误;
  • 本例只演示了水平滚动条的使用方法,垂直滚动条的使用的水平滚动条基本一致,只是消息代码和部分常量名称不同;

你可能感兴趣的:(认识VC++6-0)