共用方式為


關於滾動條

視窗可以顯示大於視窗工作區的數據物件,例如檔或點陣圖。 使用滾動條提供時,使用者可以捲動工作區中的數據物件,以檢視超出視窗框線的物件部分。

滾動條應該加入在任何客戶區域內容超出視窗框線的視窗中。 滾動條的方向決定當使用者操作滾動條時,滾動發生的方向。 水平滾動條可讓使用者將視窗的內容捲動到左側或右側。 垂直滾動條可讓使用者向上或向下卷動內容。

本節將討論下列主題。

滾動條的組件

滾動條由一個有陰影的軸組成,兩端各有一個箭頭按鈕,中間有一個 滾動盒(有時稱為拇指)。 滾動條代表視窗工作區中數據對象的整體長度或寬度;滾動盒代表工作區中可見之物件的部分。 每當使用者捲動數據物件以顯示其不同部分時,滾動盒的位置就會變更。 系統也會調整滾動條上滾動盒的大小,以顯示目前整個數據對象在視窗中可見的部分。 如果大部分物件是可見的,捲動盒會佔據大部分的捲動條軸心。 同樣地,如果只有一小部分的對象可見,滾動盒會佔用滾動條軸的一小部分。

用戶按兩下其中一個箭號按鈕、按兩下陰影滾動條軸中的區域,或拖曳滾動盒,來捲動視窗的內容。 當使用者點擊箭頭按鈕時,應用程式會將內容捲動一個單位(通常是單行或欄)。 當使用者按兩下陰影區域時,應用程式會以一個視窗捲動內容。 當使用者拖曳滾動盒時所發生的捲動量取決於使用者拖曳滾動盒和滾動條的距離。 如需捲動範圍的詳細資訊,請參閱 滾動盒位置和捲動範圍

下列螢幕快照顯示具有垂直和水準滾動條的豐富編輯控件,因為它們可能會出現在 Windows Vista 中。 垂直滾動條目前「反應中」,因為螢幕快照拍攝時滑鼠指標停留在上方。

具有滾動條的豐富編輯控件 螢幕快照

標準滾動條和滾動條控件

滾動條會以標準滾動條或滾動條控件的形式包含在視窗中。 標準滾動條位於視窗的非客戶區域。 它會隨著視窗一起創建,並在視窗顯示時顯示。 標準滾動條的唯一目的是讓用戶產生卷動要求,以檢視整個工作區的內容。 您可以在建立視窗時指定 WS_HSCROLLWS_VSCROLL,或者兩者樣式,以在視窗中包含標準滾動條。 WS_HSCROLL 樣式會建立位於客戶區域底部的水準滾動條。 WS_VSCROLL 樣式會建立一個位於用戶端區域右側的垂直滾動條。 SM_CXHSCROLL和SM_CYHSCROLL系統計量值會定義標準水準滾動條的寬度和高度。 SM_CXVSCROLL和SM_CYVSCROLL值會定義標準垂直滾動條的寬度和高度。 標準滾動條屬於其所屬視窗的一部分,因此沒有自己的視窗控制代碼。

滾動條控件是屬於SCROLLBAR窗口類別的控件視窗。 滾動條控件隨即出現,而且功能類似標準滾動條,但它是個別的視窗。 作為個別視窗,捲軸控制項會獲得直接輸入焦點。 不同於標準滾動條,滾動條控件也有內建鍵盤介面。

您可以在單一視窗中視需要使用盡可能多的滾動條控制件。 當您建立滾動條控件時,必須指定滾動條的大小和位置。 不過,如果滾動條控件的視窗可以重設大小,每當視窗的大小變更時,就必須調整滾動條的大小。

使用標準滾動條的優點是系統會建立滾動條,並自動設定其大小和位置。 不過,標準滾動條有時太限制。 例如,假設您想要將工作區分割成象限,並使用個別的滾動條集來控制每個象限的內容。 您無法使用標準滾動條,因為您只能針對特定視窗建立一組滾動條。 請改用滾動條控件,因為您可以視需要將其中許多控件新增至視窗。

應用程式可以針對卷動視窗內容以外的目的提供滾動條控件。 例如,螢幕保護程式應用程式可能會提供滾動條來設定圖形在畫面上移動的速度。

滾動條控制器可以有數種樣式,可用來控制滾動條的方向和位置。 當您呼叫 CreateWindowEx 函式來建立滾動條控件時,您可以指定您想要的樣式。 某些樣式會建立使用預設寬度或高度的滾動條控件。 不過,您必須一律指定 x 和 y 座標,以及滾動條的其他維度。

如需滾動條控制件樣式的表格,請參閱 滾動條控件樣式

注意

若要搭配滾動條使用可視化樣式,應用程式必須包含指令清單,而且必須在程式開頭呼叫 InitCommonControls。 如需視覺化樣式的詳細資訊,請參閱 Visual Styles。 如需指令清單的資訊,請參閱 啟用視覺化樣式

 

滾動盒位置和捲動範圍

滾動盒的位置會以整數表示;它相對於滾動條的左端或上端,取決於滾動條是水平還是垂直。 位置必須位於卷動範圍的最小值和最大值內。 例如,在範圍為 0 到 100 的滾動條中,位置 50 位於中間,其餘位置會沿著滾動條平均分佈。 初始範圍取決於滾動條。 標準滾動條的初始範圍為 0 到 100;滾動條控件具有空白範圍(最小值和最大值都是零),除非您在建立控件時提供明確的範圍。 您可以隨時變更範圍。 您可以使用 SetScrollInfo 函式來設定範圍值,以及 GetScrollInfo 函式來擷取目前的範圍值。

應用程式通常會將滾動範圍調整為方便的整數,以便輕鬆地將滾動盒位置轉譯成對應至要捲動的數據物件的值。 例如,如果應用程式必須在一個只能顯示 16 行的視窗中顯示 260 行的文字檔,垂直滾動條範圍可以設定為 1 到 244。 如果滾動盒位於位置 1,第一行會位於視窗頂端。 如果滾動盒位於位置 244,則最後一行 (第 260 行) 會位於視窗底部。 如果應用程式嘗試指定小於最小值或大於最大值的位置值,則會改用最小或最大卷動範圍值。

您可以設定滾動條的頁面大小。 頁面大小 代表在擁有者視窗的工作區中,其目前大小可以容納的數據單位數目。 例如,如果工作區可以保留 16 行文字,則應用程式會將頁面大小設定為 16。 系統會根據頁面大小、滾動範圍和滾動條軸長度來設定滾動盒的大小。 每當包含滾動條的視窗重設大小時,應用程式應該呼叫 SetScrollInfo 函式來設定頁面大小。 應用程式可以藉由呼叫傳送 GetScrollInfo 函式來擷取目前的頁面大小。

若要在滾動條範圍和數據對象之間建立有用的關聯性,應用程式必須在數據物件的大小變更時調整範圍。

當使用者移動滾動條中的滾動盒時,滾動條會將滾動盒位置報告為捲動範圍內的整數。 如果位置是最小值,滾動盒位於垂直滾動條的頂端或水平滾動條的左端。 如果位置是最大值,滾動盒位於垂直滾動條的底部或水平滾動條的右端。

滾動條可以報告的最大值(也就是捲動位置上限)取決於頁面大小。 如果滾動條的頁面大小大於一,則捲動位置上限小於最大範圍值。 您可以使用下列公式來計算卷動位置上限:

MaxScrollPos = MaxRangeValue - (PageSize - 1) 

應用程式必須在滾動條中移動捲動滑塊。 雖然使用者要求在滾動條中捲動,但滾動條不會自動更新滾動盒位置。 相反地,它會將要求傳遞至父視窗,該視窗必須捲動數據並更新滾動盒位置。 應用程式會使用 SetScrollInfo 函式來更新滾動盒位置;否則,它會使用 SetScrollPos 函式。 因為它控制滾動條的移動,所以應用程式可以以最適合資料捲動的方式遞增移動滾動條。

滾動條可見性

當指定相等最小值和最大值時,系統會隱藏並停用標準滾動條。 如果您指定的頁面大小包含滾動條的整個視窗範圍,系統也會隱藏並停用系統預設的標準滾動條。 這樣可以在用戶區域的內容不需要時,暫時隱藏滾動條。 隱藏滾動條時,不需要透過滾動條提出卷動要求。 當您將最小值和最大值設定為不相等值,以及頁面大小不包含整個滾動範圍時,系統會啟用滾動條,並再次顯示它。 ShowScrollBar 函式也可用來隱藏或顯示滾動條。 這不會影響滾動條的範圍、頁面大小或滾動盒位置。

EnableScrollBar 函式可用來停用捲動條的其中一個或兩個箭頭。 應用程式會以灰色顯示已停用的箭號,且不會回應用戶輸入。

滾動條要求

用戶點擊捲動條的各個部分來進行捲動操作。 系統會以 WM_HSCROLLWM_VSCROLL 訊息的形式,將要求傳送至指定的視窗。 水平滾動條會傳送 WM_HSCROLL 訊息;垂直滾動條會傳送 WM_VSCROLL 訊息。 每個訊息都包含對應至使用者動作的要求程式代碼、滾動條的句柄(僅限滾動條控件),以及在某些情況下,對應至滾動盒的位置。

圖表顯示用戶在點擊滑動條的不同部分時所產生的請求代碼。

圖表,顯示兩個滾動條上每個區域相關聯的要求碼

SB_值會指定用戶採取動作。 應用程式會檢查伴隨 WM_HSCROLLWM_VSCROLL 訊息的代碼,然後執行適當的卷動作業。 在下表中,會針對每個值指定用戶的動作,後面接著應用程式的回應。 在每個案例中,應用程式會針對數據定義一個單位。 例如,垂直卷動文字的一般單位是一行文字。

請求 行動 回應
SB_LINEUP 用戶按兩下頂端滾動箭頭。 遞減滾動盒位置;依一個單位向數據頂端捲動。
SB_LINEDOWN 用戶按兩下底部滾動箭頭。 增加捲動盒的位置,將資料向下捲動一個單位。
SB_LINELEFT 使用者點擊左捲動箭號。 遞減滾動盒位置;依一個單位向數據左端捲動。
SB_LINERIGHT 使用者點擊右箭頭。 增加滾動條位置, 以一個單位向數據的右端滾動。
SB_PAGEUP 用戶點擊滾動框上方的滾動條軸。 遞減視窗內數據單位數目的滾動盒位置;依相同單位數向數據頂端捲動。
SB_PAGEDOWN 用戶點擊捲軸盒下方的捲動條軸。 依視窗中的數據單位數目遞增滾動盒位置;依相同單位數向數據底部捲動。
SB_PAGELEFT 用戶點擊滾動條桿至滾動框左邊。 將捲動框位置減少視窗內的數據單位數目;以相同的單位數向左端捲動數據。
SB_PAGERIGHT 用戶點擊滾動盒右側的滾動條軸。 依視窗中的數據單位數目遞增滾動盒位置;依相同單位數向數據右端捲動。
SB_THUMBPOSITION 使用者拖曳捲動條後釋放。 將滾動盒設定為訊息中指定的位置;依卷動方塊移動的相同單位來捲動數據。
SB_THUMBTRACK 使用者拖曳滾動盒。 將捲動方塊設置為訊息中指定的位置,並使數據向捲動方塊移動的相同比例進行捲動,以便快速繪製數據的應用程式使用。 無法快速繪製數據的應用程式必須先等候SB_THUMBPOSITION要求程式碼,再移動滾動盒並捲動數據。
SB_ENDSCROLL 用戶在按住箭號或滾動條軸後放開滑鼠。 不需要回應。

 

當使用者按下並拖曳滾動盒時,滾動條會產生SB_THUMBPOSITION和SB_THUMBTRACK請求代碼。 應用程式應該被設計來處理 SB_THUMBTRACK 或 SB_THUMBPOSITION 要求碼。

當使用者點選滾動框並放開滑鼠按鈕時,就會發生SB_THUMBPOSITION要求代碼。 處理此訊息的應用程式會在使用者將滾動盒拖曳至所需的位置並放開滑鼠按鈕之後,執行卷動作業。

SB_THUMBTRACK要求程式代碼會在使用者拖曳滾動盒時發生。 如果應用程式處理SB_THUMBTRACK要求代碼,當使用者拖曳滾動盒時,它可以捲動視窗的內容。 不過,滾動條可以在短時間內產生許多「SB_THUMBTRACK」請求代碼,因此應用程式應該只有在能夠迅速重新繪製視窗內容時,才處理這些請求代碼。

滾動條的鍵盤介面

滾動條控制件提供內建的鍵盤介面,可讓使用者使用鍵盤發出捲動要求;標準滾動條不會。 當滾動條控制件具有鍵盤焦點時,它會在使用者按下箭頭鍵時,將 WM_HSCROLLWM_VSCROLL 訊息傳送至其父視窗。 要求碼會與使用者按下的箭頭鍵對應的每個訊息一起傳送。 以下是箭號鍵及其對應的要求碼。

箭頭鍵 請求代碼
SB_LINEDOWN或SB_LINERIGHT
結束 SB_BOTTOM
SB_TOP
SB_LINEUP或SB_LINELEFT
PGDN 「SB_PAGEDOWN」或「SB_PAGERIGHT」
PGUP SB_PAGEUP或SB_PAGELEFT
SB_LINEDOWN或SB_LINERIGHT
向上 SB_LINEUP或SB_LINELEFT

 

 

注意

滾動條控件的鍵盤介面會傳送SB_TOP和SB_BOTTOM要求代碼。 SB_TOP要求代碼表示用戶已達到卷動範圍的頂端值。 應用程式會將視窗內容向下捲動,讓資料物件的頂端可見。 SB_BOTTOM要求代碼表示用戶已到達捲動範圍的底端值。 如果應用程式處理SB_BOTTOM要求程式碼,它會向上捲動視窗內容,讓數據物件的底部可見。

 

如果您想要標準滾動條的鍵盤介面,您可以自行建立一個,方法是在視窗程式中處理 WM_KEYDOWN 訊息,然後根據訊息隨附的虛擬按鍵程式代碼執行適當的捲動動作。 如需如何為滾動條建立鍵盤介面的詳細資訊,請參閱 建立標準滾動條的鍵盤介面

捲動客戶區域

滾動客戶區域的內容最簡單的方式是清除並重新繪製。 這是應用程式可能搭配SB_PAGEUP、SB_PAGEDOWN和SB_TOP要求碼使用的方法,通常需要全新的內容。

對於某些要求碼,例如SB_LINEUP和SB_LINEDOWN,並非所有內容都需要清除,因為有些在捲動之後仍會顯示。 ScrollWindowEx 函式會保留用戶區內容的一部分,將保留的部分移動指定的距離,並且準備用戶區的其餘部分以繪製新資訊。 ScrollWindowEx 會使用 BitBlt 函式,將特定部分的數據物件移至工作區內的新位置。 客戶區域中的任何未覆蓋部分(任何未保留的專案)都會在下一個 WM_PAINT 訊息發生時失效、清除並重繪。

ScrollWindowEx 函式可以用來排除捲動操作中的某一部分用戶區域。 這會防止具有固定位置的專案(例如子視窗)在客戶區內移動。 它會自動使接收新資訊的工作區部分失效,因此應用程式不需要計算自己的裁剪區域。 如需裁剪的詳細資訊,請參閱裁剪

通常,應用程式會將視窗的內容捲動至與滾動條所指示相反的方向。 例如,當使用者按兩下滾動盒下方區域中的滾動條軸時,應用程式會向上捲動視窗中的物件,以顯示位於可見部分下方的物件部分。

您也可以使用 ScrollDC 函式來捲動矩形區域。

滾動條顏色和尺寸

系統定義的色彩值COLOR_SCROLLBAR控制滾動條軸內的色彩。 使用 GetSysColor 函式來判斷滾動條軸的色彩,以及 SetSysColors 函式來設定滾動條軸的色彩。 不過請注意,這種色彩變更會影響系統中的所有滾動條。

您可以呼叫 getSystemMetrics 函式,以取得系統在標準滾動條中使用的點陣圖維度。 以下是與滾動條相關聯的系統計量值。

系統指標 描述
SM_CXHSCROLL 水平滾動條上的箭頭位圖寬度
SM_CXHTHUMB 水平滾動條上的滾動盒寬度。 擷取的值是頁面大小為零時的滾動條寬度。
SM_CXVSCROLL 垂直滾動條上的箭頭點陣圖寬度
SM_CYHSCROLL 水平滾動條上的箭頭位圖高度
SM_CYVSCROLL 垂直滾動條上的箭頭位圖高度
SM_CYVTHUMB 垂直滾動條上的捲動方塊的高度。 這個值會取得頁數大小為零時的滾動條高度。