滚动条控件简介

滚动条大家也很熟悉了,Windows窗口中很多都有滚动条。前面讲的列表框和组合框设置了相应属性后,如果列表项显示不下也会出现滚动条。滚动条分为水平滚动条(Horizontal Scroll Bar)和垂直滚动条(Vertical Scroll Bar)两种。滚动条中有一个滚动块,用于标识滚动条当前滚动的位置。我们可以拖动滚动块,也可以用鼠标点击滚动条某一位置使滚动块移动。

从滚动条的创建形式来分,有标准滚动条和滚动条控件两种。像列表框和组合框设置了WS_HSCROLL 或WS_VSCROLL风格以后出现的滚动条,不是一个独立的窗口,而是这些窗口的一部分,这就是标准滚动条。而滚动条控件是一个独立的窗口,它可以获得焦点,响应某些操作。

滚动条控件的创建

MFC也为滚动条控件的操作提供了类,即为CScrollBar类。

滚动条控件的创建依然有两种方式,一种是直接在Toolbox中将滚动条控件拖入对话框模板,然后添加控件变量使用,另一种就是用CScrollBar类的Create成员函数动态创建。这两种方式适用于不同的场合。

CScrollBar类的成员函数Create的函数原型如下:

virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID 
);

此函数与其他控件类的Create函数原型基本相同。参数dwStyle指定滚动条控件的风格,rect指定滚动条控件的位置和尺寸,pParentWnd为指向滚动条控件父窗口的指针,nID指定滚动条控件的ID。下面鸡啄米简单介绍几个主要的滚动条控件风格,更加具体的可以查阅MSDN。

SBS_HORZ:指定滚动条为水平滚动条。如果没有指定SBS_BOTTOMALIGN或SBS_TOPALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。
       SBS_VERT:指定滚动条为垂直滚动条。如果没有指定SBS_RIGHTALIGN或SBS_LEFTALIGN风格,则滚动条的高度、宽度和位置由Create函数的rect参数给出。
       SBS_TOPALIGN:与SBS_HORZ配合使用。滚动条的上边缘与Create函数的rect参数指定矩形的上边缘对齐。滚动条高度为系统滚动条的默认高度。
       SBS_BOTTOMALIGN:与SBS_HORZ配合使用。滚动条的下边缘与Create函数的rect参数指定矩形的下边缘对齐。滚动条高度为系统滚动条的默认高度。
       SBS_LEFTALIGN:与SBS_VERT配合使用。滚动条的左边缘与Create函数的rect参数指定矩形的左边缘对齐。滚动条宽度为系统滚动条的默认宽度。
       SBS_RIGHTALIGN:与SBS_VERT配合使用。滚动条的右边缘与Create函数的rect参数指定矩形的右边缘对齐。滚动条宽度为系统滚动条的默认宽度。

dwStyle参数可以是以上风格中某几个的组合,另外一般也会用到WS_CHILD、WS_VISIBLE风格。例如,创建一个水平滚动条控件,dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_HORZ,创建垂直滚动条控件时dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_VERT。

CScrollBar类的主要成员函数

BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);

获取的滚动条的参数信息,该信息为SCROLLINFO结构体的形式。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针。SCROLLINFO结构体的定义如下:

C++代码
  1. typedef struct tagSCROLLINFO {
  2. UINT cbSize;         // 结构的尺寸(字节为单位)
  3. UINT fMask;          // 说明结构中的哪些参数是有效的,可以是屏蔽值的组合,如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效
  4. int  nMin;           // 滚动范围最小值,当fMask 中包含SIF_RANGE 时有效
  5. int  nMax;           // 滚动范围最大值,当fMask 中包含SIF_RANGE 时有效
  6. UINT nPage;          // 页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效
  7. int  nPos;           // 滚动框的位置,当fMask 中包含SIF_POS 有效
  8. int  nTrackPos;      // 滚动时滚动框的位置,当fMask 中包含SIF_TRACKPOS 时有效,该参数只能查询,不能设置,最好不要用该参数来查询拖动时滚动框的位置
  9. }   SCROLLINFO, *LPSCROLLINFO;
  10. typedef SCROLLINFO CONST *LPCSCROLLINFO;

参数nMask 的含义与SCROLLINFO 结构体中的fMask一样。该函数在获取信息成功则返回TRUE,否则返回FALSE。

BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);

用于设置滚动条的各种参数信息。参数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:滚动结束

CScrollBar类应用实例

讲完了基础知识,鸡啄米还是给大家一个简单的实例。例子非常简单,就是在一个对话框中加入一个水平滚动条控件和一个编辑框控件,无论滚动条控件是在滚动还是静止,编辑框中都显示滚动块的当前位置。以下是具体开发步骤:

1. 创建一个基于对话框的MFC工程,名称设置为“Example26”。

2. 在自动生成的对话框模板IDD_EXAMPLE26_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个Horizontal Scroll Bar控件,ID设置为IDC_HORI_SCROLLBAR。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“滚动块当前位置:”,编辑框的ID设为IDC_HSCROLL_EDIT,Read Only属性设为True。此时的对话框模板如下图:

3. 为滚动条IDC_HORI_SCROLLBAR添加CScrollBar类型的控件变量m_horiScrollbar。

4. 在对话框初始化时,我们需要设置滚动条的滚动范围和初始位置,并在编辑框中显示初始位置,那么需要修改CExample26Dlg::OnInitDialog()函数为:

C++代码
  1. BOOL CExample26Dlg::OnInitDialog()
  2. {
  3. CDialogEx::OnInitDialog();
  4. // Add "About..." menu item to system menu.
  5. // IDM_ABOUTBOX must be in the system command range.
  6. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  7. ASSERT(IDM_ABOUTBOX < 0xF000);
  8. CMenu* pSysMenu = GetSystemMenu(FALSE);
  9. if (pSysMenu != NULL)
  10. {
  11. BOOL bNameValid;
  12. CString strAboutMenu;
  13. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
  14. ASSERT(bNameValid);
  15. if (!strAboutMenu.IsEmpty())
  16. {
  17. pSysMenu->AppendMenu(MF_SEPARATOR);
  18. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  19. }
  20. }
  21. // Set the icon for this dialog.  The framework does this automatically
  22. //  when the application's main window is not a dialog
  23. SetIcon(m_hIcon, TRUE);         // Set big icon
  24. SetIcon(m_hIcon, FALSE);        // Set small icon
  25. // TODO: Add extra initialization here
  26. // 设置水平滚动条的滚动范围为1到100
  27. m_horiScrollbar.SetScrollRange(1, 100);
  28. // 设置水平滚动条的初始位置为20
  29. m_horiScrollbar.SetScrollPos(20);
  30. // 在编辑框中显示20
  31. SetDlgItemInt(IDC_HSCROLL_EDIT, 20);
  32. return TRUE;  // return TRUE  unless you set the focus to a control
  33. }

5. 现在滚动条还不能正常滚动,并且编辑框中数字也不随滚动改变。根据上面所讲,我们可以重载CExample26Dlg类的OnHScroll函数。具体操作为,在CExample26Dlg类的属性页面的工具栏上点“Messages”按钮,找到WM_HSCROLL消息,添加响应函数就可以了。OnHScroll函数重写后如下:

C++代码
  1. 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. switch (nSBCode)
  6. {
  7. // 如果向左滚动一列,则pos减1
  8. case SB_LINEUP:
  9. pos -= 1;
  10. break;
  11. // 如果向右滚动一列,则pos加1
  12. case SB_LINEDOWN:
  13. pos  += 1;
  14. break;
  15. // 如果向左滚动一页,则pos减10
  16. case SB_PAGEUP:
  17. pos -= 10;
  18. break;
  19. // 如果向右滚动一页,则pos加10
  20. case SB_PAGEDOWN:
  21. pos  += 10;
  22. break;
  23. // 如果滚动到最左端,则pos为1
  24. case SB_TOP:
  25. pos = 1;
  26. break;
  27. // 如果滚动到最右端,则pos为100
  28. case SB_BOTTOM:
  29. pos = 100;
  30. break;
  31. // 如果拖动滚动块滚动到指定位置,则pos赋值为nPos的值
  32. case SB_THUMBPOSITION:
  33. pos = nPos;
  34. break;
  35. // 下面的m_horiScrollbar.SetScrollPos(pos);执行时会第二次进入此函数,最终确定滚动块位置,并且会直接到default分支,所以在此处设置编辑框中显示数值
  36. default:
  37. SetDlgItemInt(IDC_HSCROLL_EDIT, pos);
  38. return;
  39. }
  40. // 设置滚动块位置
  41. m_horiScrollbar.SetScrollPos(pos);
  42. CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
  43. }

6. 编译运行程序,弹出结果对话框,可以自己拖动滚动块看是否能正常滚动,并且编辑框中也显示了正确的数值。效果如下:

至于垂直滚动条,其实与水平滚动条类似,大家可以自己写写垂直滚动条的例子,鸡啄米就不再举例了。

滚动条控件的内容就讲到这里了,比较基础,但这些是以后应用滚动条控件的必知内容。鸡啄米欢迎大家常来此学习交流,谢谢。

转载地址:http://www.jizhuomi.com/software/191.html

转载于:https://www.cnblogs.com/zfluo/p/5131900.html

鸡啄米vc++2010系列25(滚动条控件Scroll Bar)相关推荐

  1. 鸡啄米vc++2010系列11(非模态对话框的创建)

    上一节鸡啄米讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 鸡啄米已经说过,非模态对话框显示后,程序其他窗口仍能正常运行,可以响应用户输入,还可以相互切换.鸡啄米会将 ...

  2. 鸡啄米vc++2010系列32(标签控件Tab Control 下)

    上一节中鸡啄米讲了标签控件知识的上半部分,本节继续讲下半部分. 标签控件的创建 MFC为标签控件的操作提供了CTabCtrl类. 与之前的控件类似,创建标签控件可以在对话框模板中直接拖入Tab Con ...

  3. 鸡啄米vc++2010系列40(文档、视图和框架:分割窗口)

    分割窗口概述 分割窗口,顾名思义,就是将一个窗口分割成多个窗格,在每个窗格中都包含有视图,或者是同一类型的视图,或者是不同类型的视图. MFC分割窗口的方式有两种,动态分割和静态分割. 动态分割窗口通 ...

  4. 鸡啄米vc++2010系列12(属性页对话框)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  5. 鸡啄米vc++2010系列7(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

  6. 鸡啄米vc++2010系列35(工具栏资源及CToolBar类)

    工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程序会执行相应的操作,如果鼠标没有点击,只是停留在某个按钮上一会后,会弹出一个小窗 ...

  7. 鸡啄米vc++2010系列2(项目文件分析)

    用应用程序向导生成框架程序后,我们可以在之前设置的Location下看到以解决方案名命名的文件夹,此文件夹中包含了几个文件和一个以工程名命名的子文件夹,这个子文件夹中又包含了若干个文件和一个res文件 ...

  8. 鸡啄米vc++2010系列27(列表视图控件List Control 上)

    列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符串内容以列表的方式显示出来,这种显示方式的特点是整洁.直观,在实际应用中能为用户带来方便. 列表视图控件是对前面讲到 ...

  9. c语言类静态数据成员函数,鸡啄米:C++编程入门系列之二十一(C++程序设计必知:类的静态成员)...

    鸡啄米在上一讲数据和函数中讲到,函数之间共享数据也就是此函数访问彼函数的数据主要是通过局部变量.全局变量.类的数据成员.类的静态成员及友元实现的,前三个已经讲过了,这一讲鸡啄米来讲讲静态成员.静态成员 ...

  10. 鸡啄米:C++编程入门系列之二(原码、反码与补码)

    转载自: http://www.jizhuomi.com/software/23.html 上一节进制数中鸡啄米讲了二进制.八进制.十进制和十六进制数的表示方法和相互转换关系.这节主要讲解二进制的几种 ...

最新文章

  1. 干货|全球人工智能专利分布战情图
  2. 前端学习(3170):react-hello-react之实现底部功能
  3. 2018 ACM-ICPC World Finals - Beijing F.Go with the Flow
  4. python都有哪些变量_Python变量作用域有哪些
  5. Git 分支管理最佳实践(转载)
  6. termux使用教程python手机_渗透测试|利用手机攻击电脑(Termux终端初体验)
  7. oldwain随便写
  8. 字节跳动校招面试题演练
  9. 4十4十4写成乘法算式_乘法算式怎么写
  10. PYNQ(ZYNQ)入门资料合集1
  11. 基于php的宠物医院管理系统的设计与实现,php宠物医院信毕业设计息管理系统
  12. Android逆向之旅---静态方式破解微信获取聊天记录和通讯录信息
  13. 在Allegro软件中的Groups组创建之后怎么进行打散呢?
  14. matlab 数据透视表,MATLAB | 用行为数据处理EEG数据事件码
  15. android录音波浪动画_Android使用音频信息绘制动态波纹
  16. 在计算机语言中go是什么意思,作为编程语言,go有什么不同?
  17. windows自带便笺使用
  18. catia过载属性使用方法_catia属性自动提取
  19. 如何使用python批量下载-如何用Python批量下载卫星地图
  20. 售前工程师——Saas系统

热门文章

  1. Mac电脑如何让聚焦功能显示在菜单栏?
  2. [MAC] 6 个好用小技巧
  3. Screaming Frog SEO Spider for Mac进行网页抓取和数据提取的技巧
  4. 想要轻松制作GIF图片,来看篇超全面的分析!
  5. 移动医疗的服务怎么做?来听听传统医疗器械厂商怎么说
  6. 《Linux内核修炼之道》——2.2 编译内核
  7. Upgrade to Spring Boot 1.4
  8. Bean在Spring和SpringMVC中无所不在
  9. SparkSession与SparkContext SparkConf SQLContext HiveContext StreamingContext
  10. 程序员30多岁了还单身的原因