MFC-给窗口添加滚动条

创建滚动条

滚动条是这样一个窗口,窗口两端各有一个箭头,之间还有一个可用鼠标拖动的滑块,无论你怎么点击滚动条,都是由窗口自己决定如何响应消息,滚动条自己很少响应消息。
给窗口添加滚动条,是Windows编程中最容易的事情:
如果要添加垂直滚动条,则创建WS_VSCROLL样式的窗口;
如果要添加水平滚动条,则创建WS_HSCROLL样式的窗口;
如果要同时创建水平滚动条和垂直滚动条,则两种样式都采用;
例如,我们前面讲过,传递给CFrameWnd::Creat的第三个参数就是窗口样式,如果你不填的话,就是默认形式,默认值为 WS_OVERLAPPEDWINDOW.
我们可以举一个例子,看如下代码:

//创建具有垂直滚动条的框架窗口
Creat(NULL,_T("TheApplication"),WS_OVERLAPPEDWINDOW|WS_VSCROLL);

设定滚动条的范围,位置以及页面大小

创建了滚动条之后,还要给它设置范围位置以及页面大小等初始值。
1)range是一对整型数,确定滚动条移动的上下限;
2)position是一个整型数,制定上述范围内的当前位置;
3)page size设定了滑块的尺寸,直观的反映了窗口尺寸和可滚动视图尺 寸之间的关系。

设定滚动条位置与范围的函数为:

//将垂直滚动条的分为设置为0到100
CWnd::SetScrollRange(SB_VERT,0,100,TRUE);
//设置滚动条的当前位置为50
CWnd::SetScrollPos(SB_VERT,50,TRUE);

//对于水平滚动条,则把SB_VERT改为SB_HORZ

传递给SetScrollRange与SetScrollPos的参数TRUE意味着需要重画滚动条来反映这些值的变化,而参数FALSE禁止重画。
在最初的Windows版本中就有SetScrollRange与SetScrollPos函数,但是在现在的版本中,设定滚动条的位置与范围常用的函数为CWnd::SetScrollInfo,这样的话使用一个函数就能够设定范围与位置等参数。

CWnd::SetScrollInfo函数接受的三个参数如下:
1)SB_VERT 与SB_HORZ,如果想一次初始化两个滚动条,SB_BOTH.
2)指向SCROLLINFO结构的指针
3)一个BOOL值,确定滚动条是否需要重画(TRUE或者是FALSE)

SCROLLINFO在Winuser.h中定义如下:

typedef struct tagSCROLLINFO
{
  UNIT cbSize; //指定结构的大小
  UNIT fMask;
  int nMin;    //指定滚动条的范围
  int nMax;
  UNIT nPage;   //指定页面的尺寸
  int nPos;     //指定位置
  int nTrackPos; //鼠标拖动滑块时,返回滚动条位置信息
}SCROLLINFO,FAR*LPSCROLLINFO;

其中,fMask保持下面字段一个或者是多个:

  1. SIF_DISABLENOSCROLL 使滚动条不可用;
  2. SIF_PAGE 表示nPage保存有页面尺寸;
  3. SIF_POSE 表示nPos保存有滚动条位置;
  4. SIF_RANGE 表示nMin与nMax保存有滚动条范围;
  5. SIF_ALL 等价于SIF_PAGE |SIF_POSE |SIF_RANGE

使滚动条滑块大小和窗口尺寸同步变动

滚动条滑块的大小反映了窗口与虚拟空间相对尺寸的大小,所以当窗口尺寸变化时要更新滑块的大小,具体机制如下:
1) 窗口接收WM_SIZE消息——调用带有SIF_PAGE 的SetScrollInfo函数
2)在窗口建立的时候,传来第一个WM_SIZE消息,以后每当窗口改变其大小的时候,都会有WM_SIZE传来,在MFC中,消息映射表中有
ON_WM_SIZE这一项,它将WM_SIZE消息引导到OnSize处理程序中,
该程序原型如下:

afx_msg void OnSize(UNIT nType,int cx,int cy);
//nType参数通知窗口是否被最小化最大化或用代码SIZE_MINIMIZED,SIZE_MAXIMIZED或SIZE_RESTORED修改了尺寸;
//cx,cy是用户新的宽度和高度,用像素表示;

处理滚动条消息

滚动条给拥有它的窗口发消息,通知窗口有滚动事件,水平滚动条发送
WM_HSCROLL消息,垂直滚动条发送WM_VSCROLL消息,在MFC
中,这些消息由窗口消息映射表中的ON_WM_HSCROLL与ON_WM_VSCROLL引导到函数OnHScroll和OnVScroll中,滚动条的消息处理程序如下:

afx_msg OnHScroll(UNIT nCode,UNIT nPos,CScrollBar*pScrollBar);
afx_msg OnVScroll(UNIT nCode,UNIT nPos,CScrollBar*pScrollBar);

nCode指定产生消息的事件类型,应用程序在OnVScroll()函数的nCode参数中可能接收到的时间通知一共有七种,如下表所示:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/godqiao/article/details/78554586