關於滾動條
視窗可以顯示大於視窗工作區的數據物件,例如檔或點陣圖。 使用滾動條提供時,使用者可以捲動工作區中的數據物件,以檢視超出視窗框線的物件部分。
滾動條應該包含在工作區內容超出視窗框線的任何視窗中。 滾動條的方向決定當使用者操作滾動條時,捲動發生的方向。 水平滾動條可讓使用者將視窗的內容捲動到左側或右側。 垂直滾動條可讓使用者向上或向下卷動內容。
本節將討論下列主題。
滾動條的元件
滾動條由每個結尾有箭號按鈕的陰影軸和 箭號按鈕之間的滾動盒 (有時稱為拇指)組成。 滾動條代表視窗工作區中數據對象的整體長度或寬度;滾動盒代表工作區中可見之物件的部分。 每當使用者捲動數據物件以顯示其不同部分時,滾動盒的位置就會變更。 系統也會調整滾動條滾動盒的大小,使其指出目前在視窗中可見整個數據對象的哪個部分。 如果大部分對像是可見的,滾動盒會佔用大部分滾動條軸。 同樣地,如果只有一小部分的對象可見,滾動盒會佔用滾動條軸的一小部分。
用戶按兩下其中一個箭號按鈕、按兩下陰影滾動條軸中的區域,或拖曳滾動盒,來捲動視窗的內容。 當使用者按兩下箭號按鈕時,應用程式會將內容捲動一個單位(通常是單行或欄)。 當使用者按兩下陰影區域時,應用程式會以一個視窗捲動內容。 當使用者拖曳滾動盒時所發生的捲動量取決於使用者拖曳滾動盒和滾動條的距離。 如需捲動範圍的詳細資訊,請參閱 滾動盒位置和卷動範圍。
下列螢幕快照顯示具有垂直和水準滾動條的豐富編輯控件,因為它們可能會出現在 Windows Vista 中。 垂直滾動條目前為「作用中」,因為滑鼠指標在拍攝螢幕快照時將滑鼠指標停留在上方。
標準滾動條和滾動條控件
滾動條會以標準滾動條或滾動條控件的形式包含在視窗中。 標準滾動條位於視窗的非工作區。 它會使用視窗建立,並在視窗顯示時顯示。 標準滾動條的唯一目的是讓用戶產生卷動要求,以檢視整個工作區的內容。 您可以在視窗中指定WS_HSCROLL、WS_VSCROLL或兩種樣式,以在視窗中包含標準滾動條。 WS_HSCROLL樣式會建立位於工作區底部的水準滾動條。 WS_VSCROLL樣式會建立位於工作區右側的垂直滾動條。 SM_CXHSCROLL和SM_CYHSCROLL系統計量值會定義標準水準滾動條的寬度和高度。 SM_CXVSCROLL和SM_CYVSCROLL值會定義標準垂直滾動條的寬度和高度。 標準滾動條是其相關聯視窗的一部分,因此沒有自己的視窗句柄。
滾動條控件是屬於SCROLLBAR窗口類別的控件視窗。 滾動條控件隨即出現,而且功能類似標準滾動條,但它是個別的視窗。 作為個別視窗,滾動條控件會採用直接輸入焦點。 不同於標準滾動條,滾動條控件也有內建鍵盤介面。
您可以在單一視窗中視需要使用盡可能多的滾動條控制件。 當您建立滾動條控件時,必須指定滾動條的大小和位置。 不過,如果滾動條控件的視窗可以重設大小,每當視窗的大小變更時,就必須調整滾動條的大小。
使用標準滾動條的優點是系統會建立滾動條,並自動設定其大小和位置。 不過,標準滾動條有時太嚴格。 例如,假設您想要將工作區分割成象限,並使用個別的滾動條集來控制每個象限的內容。 您無法使用標準滾動條,因為您只能針對特定視窗建立一組滾動條。 請改用滾動條控件,因為您可以視需要將其中許多控件新增至視窗。
應用程式可以針對卷動視窗內容以外的目的提供滾動條控件。 例如,螢幕保護程式應用程式可能會提供滾動條來設定圖形在畫面上移動的速度。
滾動條控制器可以有數種樣式,可用來控制滾動條的方向和位置。 當您呼叫 CreateWindowEx 函 式以建立滾動條控件時,您可以指定您想要的樣式。 某些樣式會建立使用預設寬度或高度的滾動條控件。 不過,您必須一律指定 x 和 y 座標,以及滾動條的其他維度。
如需滾動條控件樣式的表格,請參閱 滾動條控件樣式。
注意
若要搭配滾動條使用可視化樣式,應用程式必須包含指令清單,而且必須在程式開頭呼叫 InitCommonControls。 如需可視化樣式的資訊,請參閱 可視化樣式。 如需指令清單的資訊,請參閱 啟用可視化樣式。
滾動盒位置和捲動範圍
滾動盒的位置會以整數表示;它相對於滾動條的左端或上端,取決於滾動條是水平還是垂直。 位置必須位於卷動範圍的最小值和最大值內。 例如,在範圍為 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_HSCROLL或WM_VSCROLL訊息的形式,將要求傳送至指定的視窗。 水平滾動條會傳送 WM_HSCROLL 訊息;垂直滾動條會傳送 WM_VSCROLL 訊息。 每個訊息都包含對應至使用者動作的要求程式代碼、滾動條的句柄(僅限滾動條控件),以及在某些情況下,對應至滾動盒的位置。
下圖顯示用戶按兩下滑條的各個部分時所產生的要求碼。
SB_值會指定用戶採取動作。 應用程式會 檢查伴隨WM_HSCROLL 和 WM_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_HSCROLL和WM_VSCROLL訊息傳送至其父視窗。 要求碼會與使用者按下的箭頭鍵對應的每個訊息一起傳送。 以下是箭號鍵及其對應的要求碼。
箭頭鍵 | 要求代碼 |
---|---|
DOWN | SB_LINEDOWN或SB_LINERIGHT |
END | SB_BOTTOM |
HOME | SB_TOP |
LEFT | SB_LINEUP或SB_LINELEFT |
PGDN | SB_PAGEDOWN或SB_PAGERIGHT |
PGUP | SB_PAGEUP或SB_PAGELEFT |
RIGHT | SB_LINEDOWN或SB_LINERIGHT |
UP | 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 | 垂直滾動條上的滾動盒高度。 這個值會擷取滾動條的高度,其頁面大小為零。 |