MFC常见控件:滚动条控件

1. 滚动条控件简介

滚动条大家也很熟悉了,Windows窗口中很多都有滚动条。列表框和组合框设置了相应属性后,如果列表项显示不下也会出现滚动条。滚动条分为水平滚动条(Horizontal Scroll Bar)和垂直滚动条(Vertical Scroll Bar)两种。滚动条中有一个滚动块,用于标识滚动条当前滚动的位置。我们可以拖动滚动条,也可以用鼠标点击滚动条某一位置使滚动块移动。从滚动条的创建形式来分,有标准滚动条滚动条控件两种。像列表框和组合框设置了WS_HSCROLL或WS_VSCROLL风格以后出现的滚动条,不是一个独立的窗口,而是这些窗口的一部分,这就是标准滚动条。而滚动条空间是一个独立的窗口,它可以获得焦点,响应某些操作。

2. 滚动条控件的创建

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

滚动条控件的创建依然有两种方式,一种是直接在Toolboox中将滚动条控件拖入对话框模板,然后添加控件变量使用,另一种就是用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。

3. CScrollBar类常见函数

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

获取滚动条的参数信息,该信息为SCROLLINFO结构体的形式。参数lpScrollInfo为指向SCROLLINFO结构体变量的指针。SCROLLINFO结构体的定义如下:参数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时,滚动条将被隐藏。参数bReadraw表示是否需要重绘滚动条,如果为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:滚动结束

4. 实例

添加一个添加一个Horizontal Scroll Bar控件,添加CScrollBar类型的控件变量m_horiScrollbar:

BOOL CCScrollBarDlg::OnInitDialog()中添加代码

m_horiScrollBar.SetScrollRange(1,100);// 设置水平滚动条的滚动范围为1到100

m_horiScrollBar.SetScrollPos(20);// 设置水平滚动条的初始位置为20

SetDlgItemInt(IDC_EDIT1,0); // 在编辑框中显示20

添加WM_HSCROLL消息处理事件void CCScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)代码为

int pos=m_horiScrollBar.GetScrollPos();

switch (nSBCode)

{

case SB_LINELEFT://如果向左滚动一列,pos减1

pos-=1;

break;

case SB_LINERIGHT://如果向右滚动一列,pos加1

pos+=1;

break;

case SB_PAGERIGHT://如果向右滚动一页,pos加10

pos+=10;

break;

case SB_PAGELEFT://如果向左滚动一页,pos减10

pos-=10;

break;

case SB_LEFT:// 如果滚动到最左端,则pos为1

pos=1;

break;

case SB_RIGHT: // 如果滚动到最右端,则pos为100

pos=100;

break;

case SB_THUMBPOSITION:// 如果拖动滚动块到指定位置,则pos赋值为nPos的值

pos=nPos;

break;

// 下面的m_horiScrollbar.SetScrollPos(pos);执行时

// 会第二次进入此函数,最终确定滚动块位置,并且会

// 直接到default分支,所以在此处设置编辑框中显示数值

default:

SetDlgItemInt(IDC_EDIT1,pos);

return;

}

m_horiScrollBar.SetScrollPos(pos);// 设置滚动块位置

MFC常见控件:滚动条控件相关推荐

  1. MFC之使用 Windows 标准控件

    使用 Windows 标准控件 为了提高常用代码的复用性,VC 使用控件将常用的诸如用户输入.操作数据等功能封装起来.控件通常放在对话框或工具栏中,分为 3 种:Windows 标准控件.Active ...

  2. windows常见窗口样式和控件风格以及类样式

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  3. Windows常见窗口样式和控件风格

    Windows常见窗口样式和控件风格 王佰营 徐丽红 一.窗口样式 WS_POPUP 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) WS_CHILDWINDOW 子窗口(不能与WS_P ...

  4. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...

  5. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

    用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/5 ...

  6. MFC设置对话框背景色及控件颜色

    MFC设置对话框背景色及控件颜色 一.使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { ...

  7. MFC中使用TAB Control控件

    2019独角兽企业重金招聘Python工程师标准>>> MFC中使用TAB Control控件 MFC中使用TAB Control控件(转) 假如我现在有个SDI程序,View是Fo ...

  8. android 表格控件 滚动条,tkinter给表格控件(treeview)添加滚动条

    # 定义列名集合 self.columns = ["Sno", "Name", "Score1", "Score2"] ...

  9. WPF 滚动条控件ScrollViewer的使用及自定义滚动条控件(一)

    WPF 滚动条控件ScrollViewer的使用及自定义滚动条控件(一) 首先看一下两种空间的运行效果: 左边是自定义滑条控件,右边是自带的滑条控件: **滑条使用方法:**我们在ScrollView ...

最新文章

  1. go channel 缓冲区最大限制_GO语言圣经学习笔记(八)Goroutines和Channels
  2. 深度|人工智能赋能“新基建”产业的四方面及建议
  3. strcpy函数实现的几种方式
  4. android python opencv_使用Python和OpenCV自动化Android游戏
  5. GAN处理手写图片数据集
  6. linux 同步 多终端,Linux系统如何实现不同终端间的同步
  7. Oracle全库导入表报错 ORA-39126
  8. 阿里科学家再获世界级荣誉,平头哥首席科学家谢源当选AAASFellow
  9. java 从控制台读取_转载 java从控制台读取输入的方法
  10. SDU创新实训 6.实现中文拼音模糊匹配
  11. 利用Shader Forge 做出树叶摆动的效果2DSprite__Unity
  12. 消防信号总线原理_消防联动工作原理
  13. 美国主要经济指标(2)
  14. win11 任务栏角溢出里的程序图标记录如何删除(WIN 缓存图标清理)
  15. Java学习-API
  16. 我要的精致:人间有茶是清欢
  17. 怎么学python入门?python新手学习路线
  18. 比较DirectX和OpenGL的区别
  19. 使用HBuilder将H5的项目打包成手机可安装的webapp程序(.apk)
  20. python动态规划--01背包问题

热门文章

  1. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)
  2. BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树
  3. ArrayList的容量与长度
  4. C++灵活易错特性-02
  5. angular4-http
  6. Merge into的使用详解-你Merge了没有【转】
  7. 【转】oracle内置函数 trunc 使用
  8. 一位Erlang程序猿的自白
  9. Android退出程序时的再按一次退出实现
  10. JavaScript获取文本框光标的像素位置(转载)