常见的滚动条有水平滚动条和竖直滚动条,具体的形式如下图:
当前的滚动条的功能是通过拖动下面的滚动条调整位置可以改变上编辑框的数字。具体实现过程如下:
一、添加一个Horizontal Scroll Bar控件,ID设置为IDC_HORI_SCROLLBAR。
二、再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“滚动块当前位置:”,编辑框的ID设为IDC_HSCROLL_EDIT,Read Only属性设为True。
三、为Horizontal Scroll Bar控件添加一个变量。
四、根据上面所讲,我们可以重载类的OnHScroll函数。具体操作为,在类的属性页面的工具栏上点“Messages”按钮,找到WM_HSCROLL消息,添加响应函数就可以了。
具体实现代码如下:
void CExample26Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
2.{
3. // TODO: Add your message handler code here and/or call default
4. int pos = m_horiScrollbar.GetScrollPos(); // 获取水平滚动条当前位置
5.
6. switch (nSBCode)
7. {
8. // 如果向左滚动一列,则pos减1
9. case SB_LINELEFT:
10. pos -= 1;
11. break;
12. // 如果向右滚动一列,则pos加1
13. case SB_LINERIGHT:
14. pos += 1;
15. break;
16. // 如果向左滚动一页,则pos减10
17. case SB_PAGELEFT:
18. pos -= 10;
19. break;
20. // 如果向右滚动一页,则pos加10
21. case SB_PAGERIGHT:
22. pos += 10;
23. break;
24. // 如果滚动到最左端,则pos为1
25. case SB_LEFT:
26. pos = 1;
27. break;
28. // 如果滚动到最右端,则pos为100
29. case SB_RIGHT:
30. pos = 100;
31. break;
32. // 如果拖动滚动块滚动到指定位置,则pos赋值为nPos的值
33. case SB_THUMBPOSITION:
34. pos = nPos;
35. break;
36. // 下面的m_horiScrollbar.SetScrollPos(pos);执行时会第二次进入此函数,最终确定滚动块位置,并且会直接到default分支,所以在此处设置编辑框中显示数值
37. default:
38. SetDlgItemInt(IDC_HSCROLL_EDIT, pos);
39. return;
40. }
41.
42. // 设置滚动块位置
43. m_horiScrollbar.SetScrollPos(pos);
44.
45. CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
46.}
- m_horiScrollbar.SetScrollRange(1, 100);
- // 设置水平滚动条的初始位置为20
- m_horiScrollbar.SetScrollPos(20);
- // 在编辑框中显示20
- SetDlgItemInt(IDC_HSCROLL_EDIT, 20);
用于设置滚动条的各种参数信息。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘。该函数操作成功则返回TRUE,否则返回FALSE。
int GetScrollPos( ) const;
获取滚动块的当前位置。如果失败则返回0。
int SetScrollPos(int nPos, BOOL bRedraw = TRUE);
将滚动块移动到指定位置。参数nPos指定了滚动块的新位置,参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。函数返回滚动框原来的位置,若操作失败则返回0。
void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;
获取滚动条的滚动范围。参数lpMinPos指向滚动条滚动范围的最小值,参数lpMaxPos指向滚动条滚动范围的最大值。
void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);
用于指定滚动条的滚动范围。参数nMinPos 和nMaxPos 分别指定了滚动范围的最小值和最大值,两者的差不得超过32767。当两者都为0 时,滚动条将被隐藏。参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘。
OnHScroll()与OnVScroll()函数
无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息发送出去的。对这两个消息的默认处理函数是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生类中对这两个函数进行重载,以实现滚动功能。也就是说,假设在一个对话框中放入了一个水平滚动条,我们可以在对话框类中重载OnHScroll函数,并在OnHScroll函数中实现滚动功能。
这两个函数的声明如下:
afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
参数nSBCode是通知消息码,主要通知码及含义的介绍下面已列出。nPos 是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义。如果通知消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar 为NULL。
SB_BOTTOM/SB_RIGHT:滚动到底端(右端)
SB_TOP/SB_LEFT:滚动到顶端(左端)
SB_LINEDOWN/SB_LINERIGHT:向下(向右)滚动一行(列)
SB_LINEUP/SB_LINELEFT:向上(向左)滚动一行(列)
SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滚动一页
SB_PAGEUP/SB_PAGELEFT:向上(向左)滚动一页
SB_THUMBPOSITION:滚动到指定位置
SB_THUMBTRACK:滚动框被拖动。可利用该消息来跟踪对滚动框的拖动
SB_ENDSCROLL:滚动结束