捲動列檔案(在/Platform SDK/User Interface Services/Controls/Scroll Bars中)指出SetScrollRange、SetScrollPos、GetScrollRange和GetScrollPos函式是「過時的」,但這並不完全正確。這些函式在Windows 1.0中就出現了,在Win32 API中升級以處理32位元參數。它們仍然具有良好的功能。而且,它們不與Windows程式設計中新函式相衝突。
特點,功能,用法,定義,結構,
特點
Win32 API介紹的兩個捲動列函式稱作SetScrollInfo和GetScrollInfo。這些函式可以完成以前函式的全部功能,並增加了兩個新特性。
第一個功能涉及捲動方塊的大小。您可能注意到,捲動方塊大小在SYSMETS2程式中是固定的。然而,在您可能使用到的一些Windows套用程式中,捲動方塊大小與在視窗中顯示的檔案大小成比例。顯示的大小稱作「頁面大小」。
可以使用SetScrollInfo來設定頁面大小(從而設定了捲動方塊的大小),如將要看到的SYSMETS3程式所示。
功能
GetScrollInfo函式增加了第二個重要的功能,或者說它改進了目前API的不足。假設您要使用65,536或更大單位的範圍,這在16位元Windows中是不可能的。當然在Win32中,函式被定義為可接受32位元參數,因此是沒有問題的。(記住如果使用這樣大的範圍,捲動方塊的實際物理位置數仍然由捲動列的圖素大小限制)。然而,當使用SB_THUMBTRACK或SB_THUMBPOSITION通知碼得到WM_VSCROLL或WM_HSCROLL訊息時,只提供了16位元資料來指出捲動方塊的目前位置。通過GetScrollInfo函式可以取得真實的32位元值。
用法
SetScrollInfo和GetScrollInfo函式的語法是
SetScrollInfo (hwnd, iBar, &si, bRedraw) ;
GetScrollInfo (hwnd, iBar, &si) ;
像在其他捲動列函式中那樣,iBar參數是SB_VERT或SB_HORZ,它還可以是用於捲動列控制的SB_CTL。SetScrollInfo的最後一個參數可以是TRUE或FALSE,指出了是否要Windows重新繪製計算了新資訊後的捲動列。
定義
兩個函式的第三個參數是SCROLLINFO結構,定義為:
typedef struct tagSCROLLINFO
{
UINT cbSize ; // set to sizeof (SCROLLINFO)
UINT fMask ; // values to set or get
int nMin ; // minimum range value
int nMax ;// maximum range value
UINT nPage ; // page size
int nPos ;// current position
int nTrackPos ;// current tracking position
}
SCROLLINFO, * PSCROLLINFO ;
結構
在程式中,可以定義如下的SCROLLINFO結構型態:
SCROLLINFO si ;
在呼叫SetScrollInfo或GetScrollInfo之前,必須將cbSize欄位設定為結構的大小:
si.cbSize = sizeof (si) ;
或
si.cbSize = sizeof (SCROLLINFO) ;
逐漸熟悉Windows後,您就會發現另外幾個結構像這個結構一樣,第一個欄位指出了結構大小。這個欄位使將來的Windows版本可以擴充結構並添加新的功能,並且仍然與以前編譯的版本相容。
把fMask欄位設定為一個以上以SIF字首開頭的旗標,並且可以使用C的位元操作OR運運算元(|)組合這些旗標。
SetScrollInfo函式使用SIF_RANGE旗標時,必須把nMin和nMax欄位設定為所需的捲動列範圍。GetScrollInfo函式使用SIF_RANGE旗標時,應把nMin和nMax欄位設定為從函式傳回的目前範圍。
使用SIF_PAGE旗標能夠取得頁面大小。用SetScrollInfo函式把nPage設定為所需的頁面大小。GetScrollInfo使用SIF_PAGE旗標可以取得目前頁面的大小。如果不想得到比例化的捲動列,就不要使用該旗標。
當處理帶有SB_THUMBTRACK或SB_THUMBPOSITION通知碼的WM_VSCROLL或WM_HSCROLL訊息時,通過GetScrollInfo只使用SIF_TRACKPOS旗標。從函式的傳回中,SCROLLINFO結構的nTrackPos欄位將指出目前的32位元的捲動方塊位置。