MFC编程之常用控件:滚动条控件Scroll Bar

滚动条控件的创建依然有两种方式:

  1. 一种是直接在Toolbox中将滚动条控件拖入对话框模板,然后添加控件变量使用,
  2. 另一种就是用CScrollBar类的Create成员函数动态创建;

这两种方式适用于不同的场合。

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

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

此函数与其他控件类的Create函数原型基本相同。

参数dwStyle指定滚动条控件的风格,
参数rect指定滚动条控件的位置和尺寸,
参数pParentWnd为指向滚动条控件父窗口的指针,
参数nID指定滚动条控件的ID。

简单介绍几个主要的滚动条控件风格

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, *LPSCROLLINFO;    
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:滚动结束
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值