SetScrollInfo()函数实现滚动条

SetScrollInfo可以同时实现SetScrollRange和SetScrollPos的功能。而且SetScrollInfo可以使滚动块的大小随内容的多少而改变。
其中SetScrollInfo的参数SCROLLINFO结构体中的fMask可控制有效信息。
typedef struct tagSCROLLINFO
 { UINT cbSize;    //SCROLLINFO结构体本身的字节大小
UINT fMask;       //见下面的说明
 int nMin;           //最小滚动位置
 int nMax;         //最大滚动位置
UINT nPage;        //页面尺寸
 int nPos;               //滚动块的位置
int nTrackPos;         //滚动块当前被拖动的位置,不能在SetScrollInfo中指定
} SCROLLINFO;
fMask表示设置或获取哪些数据,如:SIF_ALL所有数据成员都有效、SIF_PAGE(nPage有效)、SIF_POS(nPos有效)、SIF_RANGE(nMin和nMax有效)、SIF_TRACKPOS(nTrackPos有效)。

在使用滚动条功能时,如果要设置它的范围和位置可以用以前的函数,例如:SetScrollRange()、 SetScrollPos()、GetScrollRange()、GetScrollPos()等,但目前通常使用SetScrollInfo()与 GetScrollInfo(),使用这两个函数就要用到SCROLLINFO结构。

  
  可以先定义一个SCROLLINFO结构变量si,用&si作为以上两个函数的参数。同BeginPaint()中的&ps、GetTextMetrics()中的&tm等,这些结构都是通过这些函数被填充各域或取得各域的值。BeginPaint是填充ps的各域的值,GetTextMetrics是取得tm结构各域的值,而 SetScrollInfo()与GetScrollInfo()分别填充和取得。

  
  无论是Set还是Get,都得先设置si结构的第一个域的值,即赋给cbSize结构的大小。之后根据设置的fMask域的值进行Set或Get,当Set时,需要根据fMask的值将相关的域填充后再调用 SetScrollInfo(),这样si结构就被Set成功。当Get时,直接调用GetScrollInfo(),具体能使用哪些域的值是根据所设置的fMask域的值定的。

 

  如果要设置滚动条的范围和页面大小时,可编写以下代码:

      si.cbSize = sizeof (SCROLLINFO) ;       si.cbMask = SIF_RANGE | SIF_PAGE ;       si.nMin = 0 ;       si.nMax = NUMLINES - 1 ;       si.nPage = cyClient / cyChar ;       SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;

而若要用到滚动条的位置时,可以这样使用:    先si.cbSize = sizeof (si) ;     si.fMask = SIF_ALL ; // 表示Get后将使用si结构的位置、页面大小等量    GetScrollInfo (hwnd, SB_VERT, &si)

  然后就可直接使用si.nPos、si.nPage、si.nTrackPos等量,这些量就是从si结构中通过Get函数获得的,

  Platform SDK中如下描述:

  
The SCROLLINFO structure contains scroll bar parameters to be set by the SetScrollInfo function (or SBM_SETSCROLLINFO message), or retrieved by the GetScrollInfo function (or SBM_GETSCROLLINFO message). 

typedef struct tagSCROLLINFO {  // si     UINT cbSize;     UINT fMask;     int  nMin;     int  nMax;     UINT nPage;     int  nPos;     int  nTrackPos; }   SCROLLINFO; typedef SCROLLINFO FAR *LPSCROLLINFO;  MemberscbSize Specifies the size, in bytes, of this structure. fMask Specifies the scroll bar parameters to set or retrieve. This member can be a combination of the following values: Value Meaning SIF_ALL Combination of SIF_PAGE, SIF_POS, SIF_RANGE, and SIF_TRACKPOS. SIF_DISABLENOSCROLL This value is used only when setting a scroll bar‘s parameters. If the scroll bar‘s new parameters make the scroll bar unnecessary, disable the scroll bar instead of removing it.  SIF_PAGE The nPage member contains the page size for a proportional scroll bar. SIF_POS The nPos member contains the scroll box position, which is not updated while the user drags the scroll box. SIF_RANGE The nMin and nMax members contain the minimum and maximum values for the scrolling range. SIF_TRACKPOS The nTrackPos member contains the current position of the scroll box while the user is dragging it. 

nMin Specifies the minimum scrolling position. nMax Specifies the maximum scrolling position. nPage Specifies the page size. A scroll bar uses this value to determine the appropriate size of the proportional scroll box. nPos Specifies the position of the scroll box. nTrackPos Specifies the immediate position of a scroll box that the user is dragging. An application can retrieve this value while processing the SB_THUMBTRACK notification message. An application cannot set the immediate scroll position; the SetScrollInfo function ignores this member.

成员说明:cbSize: SCROLLINFO结构长度字节数,该值在设置和查询参数时都必须填写。fMask: 指定结构中的哪些成员是有效,该值共有如下5种选择,可以选择多种用“OR”组合起来,该值在

设置和查询参数时都必须填写。SIF_ALL      :整个结构都有效SIF_DISABLENOSCROLL:该值仅在设定参数时使用,视控件参数设定的需要来对本结构的成员进行取舍。SIF_PAGE      :nPage成员有效SIF_POS      :nPos成员有效SIF_RANGE     :nMin和nMax成员有效nMin:滚动范围最小值nMax:滚动范围最大值nPage:页尺寸,用来确定比例滚动框的大小nPos:滚动框的位置nTrackPos:拖动时滚动框的位置,该参数只能查询,不能设置。
时间: 2024-10-29 22:07:25

SetScrollInfo()函数实现滚动条的相关文章

VC/MFC 编程技巧大总结

1 toolbar默认位图左上角那个点的颜色是透明色,不喜欢的话可以自己改. 2 VC++中 WM_QUERYENDSESSION WM_ENDSESSION 为系统关机消息. 3 Java学习书推荐:<java编程思想> 4 在VC下执行DOS命令 a. system("md c:\\12"); b. WinExec("Cmd.exe /C md c:\\12", SW_HIDE); c. ShellExecute ShellExecute(NULL,

实现系统滚动条换肤功能

http://blog.sina.com.cn/s/blog_4c3538470100gews.html 1 实现系统滚动条换肤功能 对于Windows系统中各种控件换肤功能,要数滚动条的换肤最难实现了,尤其是控件自带的系统滚动条,如Edit.ListBox.ListView.TreeView等自带的系统滚动条,要想实现其自定义的皮肤功能,用常规办法似乎都无法实现. 对于常规的皮肤定制一般都是通过定制WM_PAINT.WM_ERASEBKGND.WM_CTLCOLORxxx.NM_CUSTOMD

Winform API &quot;user32.dll&quot;中的函数

命名空间:System.Runtime.InteropServices 1 /// <summary> 2 /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图.hWnd:设备上下文环境被检索的窗口的句柄 3 /// </summary> 4 [DllImport("user32.dll", CharSet = CharSet.Auto)] 5 public static exter

MFC 控件编程之水平滚动条跟垂直滚动条

MFC 控件编程之水平滚动条跟垂直滚动条 一点水平滚动条的操作 首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置. 所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构. typedef struct tagSCROLLINFO { UINT cbSize; 自身大小 UINT fMask; 滚动条的范围.左边->右边方式. int nMin; 滚动条最小值 int nMax; 滚动

C#调用user32.dll Win32的API函数

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace WindowsAPI { class CSharp_Win32Api { #region User32.dll 函数 /// <summary> /// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以

C#调用Win32_的API函数--User32.dll

来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=230GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com C#调用Win32 的API函数--User32.dll Win32的API函数是微软自己的东西,可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候我们之直接调用Win32 的API,可以很高效的实现想要的效果. 代码 using System;using Sys

【转】MFC编辑框自动换行,垂直滚动条自动下移

1.新建一个编辑框控件(Edit Control),将其多行(Multiline)前面打勾(属性设置为True),Auto HScroll前面的勾去掉(属性设置False),这样就可以实现每一行填满后自动换行了. 2.再将垂直滚动条(Vetrical Scroll)前面打勾(属性设置为True),当输入或显示超过编辑框的大小后就会出现垂直滚动条. 3.如果是输入,滚动条会自动移动跟随到当前输入行,但是如果是设置将很多内容一次性让编辑框显示,滚动条就会一直处于最上方,需要手动拉到最下面才能看见最后

selenium操作滚动条方法

/***  滚动条滚到最下方,和滚到指定位置*/ @Test(priority =1 )    public void scrollingToBottomo(){        //使用JavaScript的scrollTo函数和document.body.scrollheihgt参数        //将页面的滚动条滑到页面的最下方        ((JavascriptExecutor) driver)        .executeScript("window.scrollTo(0, do

js获取页面窗口大小以及滚动条位置

function getPageScroll() {         var xScroll, yScroll;         if (self.pageYOffset) {             yScroll = self.pageYOffset;             xScroll = self.pageXOffset;         } else if (document.documentElement && document.documentElement.scroll