回顾上一节,讲的是组合框控件Combo Box的使用。本节详解滚动条控件Scroll Bar的相关内容。

  滚动条控件简介

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

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

  滚动条控件的创建

  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。

  CScrollBar类的主要成员函数

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

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

typedef struct tagSCROLLINFO
{
UINT cbSize; // 结构的尺寸(单位为字节)
UINT fMask; // 说明结构中的哪些参数是有效的,可以屏蔽值的组合,如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构体都有效
int nMin; // 滚动范围最小值,当fMask中包含SIF_RANGE时有效
int nMax; // 滚动范围最大值,当fMask中包含SIF_RANGE时有效
UINT nPage; // 页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效
int nPos; // 滚动框的位置,当fMask中包含SIF_POS有效
int nTrackPos; // 滚动时滚动框的位置,当fMask中包含SIF_TRACKPOS时有效,该参数只能查询,不能设置,最好不要用该参数来查询拖动时滚动框的位置
} SCROLLINFO, FAR *LPSCROLLINFO;
typedef SCROLLINFO CONST FAR *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时,滚动条将被隐藏。参数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:滚动结束

  

  CScrollBar类应用实例

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

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

  2、在自动生成的对话框模板IDD_MFCSCROLLBARDEMO_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、在对话框初始化时,我们需要设置滚动条的滚动范围和初始位置,并在编辑框中显示初始位置,那么需要修改CMFCScrollBarDemoDlg::OnInitDialog()函数为:

C++代码:

BOOL CMFCScrollBarDemoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
// 设置水平滚动条的滚动范围为1到100
m_horiScrollbar.SetScrollRange(1, 100);
// 设置水平滚动条的初始位置为20
m_horiScrollbar.SetScrollPos(20);
// 在编辑框中显示20
SetDlgItemInt(IDC_HSCROLL_EDIT, 20); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

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

C++代码:

void CMFCScrollBarDemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 获取水平滚动条当前位置
int pos = m_horiScrollbar.GetScrollPos(); switch (nSBCode)
{
// 如果向左滚动一列,则pos减1
case SB_LINELEFT:
pos -= 1;
break;
// 如果向右滚动一列,则pos加1
case SB_LINERIGHT:
pos += 1;
break;
// 如果向左滚动一页,则pos减10
case SB_PAGELEFT:
pos -= 10;
break;
// 如果向右滚动一页,则pos加10
case SB_PAGERIGHT:
pos += 10;
break;
// 如果滚动到最左端,则pos为1
case SB_LEFT:
pos = 1;
break;
// 如果滚动到最右端,则pos为100
case SB_RIGHT:
pos = 100;
break;
// 如果拖动滚动块到指定位置,则pos赋值为nPos的值
case SB_THUMBPOSITION:
pos = nPos;
break;
// 下面的m_horiScrollbar.SetScrollPos(pos);执行时
// 会第二次进入此函数,最终确定滚动块位置,并且会
// 直接到default分支,所以在此处设置编辑框中显示数值
default:
SetDlgItemInt(IDC_HSCROLL_EDIT, pos);
return;
} // 设置滚动块位置
m_horiScrollbar.SetScrollPos(pos); CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

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

  至于垂直滚动条,其实与水平滚动条类似,大家可以自己写写垂直滚动条的例子。

MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)的更多相关文章

  1. VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)

    回顾上一节,鸡啄米讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框 ...

  2. MFC编程入门之二十(常用控件:静态文本框)

    上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...

  3. VS2010/MFC编程入门之二十(常用控件:静态文本框)

    上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...

  4. VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...

  5. VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)

    前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用.      列表视图控件简介 列表视图控件List Control同样比较常见, ...

  6. MFC编程入门之二十八(常用控件:列表视图控件List Control上)

    前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...

  7. MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...

  8. VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    言归正传,鸡啄米上一节中讲了编辑框的用法,本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box ...

  9. MFC编程入门之二十七(常用控件:图片控件PictureControl)

    上一节讲的是滚动条控件,本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是 ...

随机推荐

  1. GCC-4.6.3编译linux2.6.32.12内核出现“重复的成员‘page’”错误的解决方法

    使用gcc4.6.3编译linux2.6.32.12内核出现错误如下: In file included from drivers/net/igbvf/ethtool.c:36:0: drivers/ ...

  2. 图片轮播器bcastr4.swf“&”符号的问题

    bcastr4.swf是一个很不错的网页图片轮播器,我一直使用它作为网站首页图片轮播的控件. http://xiaogui.org/bcastr-open-source-flash-image-sil ...

  3. Python快速建站系列-Part.Five.3-个人主页及资料页面

    |版权声明:本文为博主原创文章,未经博主允许不得转载. 第五部分最后一节,完成个人主页里资料页面的个人资料的展示和修改功能,不过毕竟功能比较少,个人资料其实只有昵称一项,手动滑稽. 一如既往先写出来u ...

  4. How to add taxonomy element to a summary view?

    [re: Orchard CMS] This caused me scratching my head for days and now I can even feel it's bleeding. ...

  5. js和jq添加新表格

    javascript动态实现表格: function createTable(rowCount,cellCount){ var table = document.createElement('tabl ...

  6. C语言回顾-指针

    1.指针:地址 指针变量:存放指针的变量 指针变量的定义:数据类型 *指针变量名 或者 数据类型* 指针变量名 指针变量的初始化:int *p=&a;int *p=NULL;(不能先定义后初始 ...

  7. Material Design Lite,简洁惊艳的前端工具箱 之 交互组件。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, 博客地址为http://www.cnblogs.com/jasonnode/ . 网站上有对应 ...

  8. 捷波朗 jabra BT3030 蓝牙耳机

    蓝牙版本V2.0 通话时间 8小时 按键说明:轻敲 快按轻敲两下 在1.5秒内快速按两下按 大约 1秒钟按住 大约 4秒钟 充电提示绿灯闪亮 正在充电持续绿灯 已完全充满电 检查电量按 音量上调(+) ...

  9. C语言 02 include

    stdio.h  h表示header file include"text.txt" 自己写的文件用双引号,系统自带文件用<>. 绝对路径用 / ,相对路径不带/

  10. 006_Salesforce Sharing 使用说明

    Salesforce Sharing 使用说明 背景说明:Salesforce共享实施记录和其它数据时,需要员工之间共享或多个用户在一个组织间的共享.然而,共享这些数据是有风险的,尤其是当它涉及到敏感 ...