在視窗程序中添加捲軸很容易,只要在CreateWindow中將WS(window style)添加WS_VSCROLL與WS_HSCROLL即可,然後再調用相應的函數就可以使用了。
捲軸有範圍和位置(捲動方塊在捲軸上的位置)屬性,設定範圍和位置可以使用之前的函數,如: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函數獲得的,
也是之前通過Set函數設定的值。
SCROLLINFO結構:
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 {
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;
成員說明:
cbSize: SCROLLINFO結構長度位元組數,該值在設定和查詢參數時都必須填寫。
fMask: 指定結構中的哪些成員是有效,該值共有如下5種選擇,可以選擇多種用“OR”組合起來,該值在
設定和查詢參數時都必須填寫。
SIF_ALL :整個結構都有效
SIF_DISABLENOSCROLL:該值僅在設定參數時使用,視控制項參數設定的需要來對本結構的成員進行取捨。
SIF_PAGE :nPage成員有效
SIF_POS :nPos成員有效
SIF_RANGE :nMin和nMax成員有效
nMin:滾動範圍最小值
nMax:滾動範圍最大值
nPage:頁尺寸,用來確定比例捲動方塊的大小
nPos:捲動方塊的位置
nTrackPos:拖動時捲動方塊的位置,該參數只能查詢,不能設定。