關於追蹤列控件
追蹤列是一個視窗,其中包含通道中的滑桿(有時稱為拇指),以及選擇性的刻度標記。 當用戶移動滑桿時,使用滑鼠或方向鍵,追蹤列會傳送通知訊息來指出變更。
當您想要用戶選取離散不帶正負號的整數值或範圍內的一組連續不帶正負號整數值時,追蹤列會很有用。 例如,您可以使用追蹤列讓使用者將滑桿移至指定的刻度,以設定鍵盤的重複速率。 下圖顯示典型的追蹤列。
追蹤列中的滑桿會以您建立時指定的遞增移動。 此範圍中的值稱為邏輯單元。 例如,如果您指定追蹤列應該有範圍從 0 到 5 的邏輯單元,滑桿只能佔用六個位置:在追蹤列左邊的位置,而該範圍中每個遞增的位置各一個位置。 一般而言,每個位置都是由刻度標記來識別;不過,刻度標記的數目是任意的,而且可能小於邏輯位置的數目。
您可以使用 CreateWindowEx 函式來建立追蹤列,並指定TRACKBAR_CLASS窗口類別。 建立追蹤列之後,您可以使用追蹤列訊息來設定和擷取其許多屬性。 您可以進行的變更包括設定滑桿的最小和最大位置、繪製刻度標記、設定選取範圍,以及重新調整滑桿定位。
選取範圍
如果您使用TBS_ENABLESELRANGE樣式建立追蹤列,您可以指定選取範圍。 追蹤列會反白顯示選取範圍,並在開頭和結尾顯示三角形刻度,如下圖所示。
追蹤列的選取範圍不會以任何方式影響其功能。 實作範圍由應用程式決定。 您可以使用下列其中一種方式來執行此動作:
- 使用選取範圍可讓用戶設定某些參數的最大值和最小值。 例如,使用者可以將滑桿移至某個位置,然後按下標示為 “Max” 的按鈕。 然後,應用程式會設定選取範圍,以顯示用戶選擇的值。
- 藉由處理WM_HSCROLL或WM_VSCROLL通知,並不允許選取範圍以外的任何移動,將滑桿的移動限制為控件內預先決定的子範圍。 例如,如果使用者可用的值範圍可能會因為使用者所做的其他選擇或根據可用的資源而變更,您可能會這麼做。
追蹤列訊息
追蹤列的邏輯單位是追蹤列可以表示的連續值集合。 一旦建立追蹤列,通常會使用TBM_SETRANGE訊息來指定可能值的範圍來定義它們。 應用程式可以使用TBM_SETRANGE、TBM_SETRANGEMAX或TBM_SETRANGEMIN來動態改變範圍。
若要擷取滑桿的位置(也就是使用者已選擇的值),請使用 TBM_GETPOS 訊息。 若要設定滑桿的位置,請使用 TBM_SETPOS 訊息。
除非指定 TBS_NOTICKS 樣式,否則追蹤列會自動在其開頭和結尾顯示刻度標記。 (在 Microsoft Visual Studio 資源編輯器中,這表示將 Tick Marks 屬性設定為 False。您可以使用 TBS_AUTOTICKS 樣式,在追蹤列上定期自動顯示其他刻度標記。 根據預設, TBS_AUTOTICKS 追蹤列會在追蹤列範圍的每個增量上顯示刻度標記。 若要指定自動刻度標記的不同間隔,請將TBM_SETTICFREQ訊息傳送至追蹤列。 例如,您可以使用此訊息,只顯示介於1到100範圍內的10個刻度。
若要設定單一刻度標記的位置,請傳送 TBM_SETTIC 訊息。 追蹤列會維護 DWORD 值的陣列,以儲存每個刻度標記的位置。 陣列不包含追蹤列自動建立的第一個和最後一個刻度標記。 當您傳送 TBM_GETTIC 訊息以擷取對應刻度的位置時,您可以在此陣列中指定索引。 或者,您可以傳送 TBM_GETPTICS 訊息來擷取陣列的指標。 陣列中的元素數目等於兩個小於TBM_GETNUMTICS訊息所傳回的刻度計數。 這是因為TBM_GETNUMTICS傳回的計數包含數位中未包含的第一個和最後一個刻度標記。 若要擷取刻度標記的實體位置,請在追蹤列視窗的用戶端座標中傳送 TBM_GETTICPOS 訊息。 TBM_CLEARTICS訊息會移除追蹤列刻度標記的第一個和最後一個。
追蹤列的線條大小決定滑桿在響應箭頭鍵的鍵盤輸入時移動的距離,例如向右鍵或向下鍵。 若要擷取或設定行大小,請傳送TBM_GETLINESIZE和TBM_SETLINESIZE訊息。 當使用者按下箭頭鍵時,追蹤列也會將TB_LINEUP和TB_LINEDOWN通知碼傳送至其父視窗。
追蹤列的頁面大小會決定滑桿在響應鍵盤輸入時移動的距離,例如PAGE UP或PAGE DOWN鍵,或滑鼠輸入,例如追蹤列通道中的點選。 若要擷取或設定頁面大小,請傳送TBM_GETPAGESIZE和TBM_SETPAGESIZE訊息。 追蹤列也會在收到捲動頁面的鍵盤或滑鼠輸入時,將TB_PAGEUP和TB_PAGEDOWN通知代碼傳送至其父視窗。 如需詳細資訊,請參閱 追蹤列通知訊息。
應用程式可以傳送訊息來擷取追蹤列的維度。 TBM_GETTHUMBRECT訊息會擷取滑桿的周框。 TBM_GETTHUMBLENGTH訊息會擷取滑桿的長度。 TBM_GETCHANNELRECT訊息會擷取追蹤列通道的周框,也就是滑桿移動所在的區域。 它包含選取範圍時的醒目提示。 如果追蹤列具有TBS_FIXEDLENGTH樣式,您可以傳送TBM_SETTHUMBLENGTH訊息來變更滑桿的長度。
您可以藉由將訊息傳送至追蹤列來擷取或設定選取範圍。 使用TBM_SETSEL訊息來設定選取範圍的開始和結束位置。 若要只設定開始位置或只設定選取範圍的結束位置,請傳送TBM_SETSELSTART或TBM_SETSELEND訊息。 若要擷取選取範圍的開始或結束位置,請傳送 TBM_GETSELSTART 或 TBM_GETSELEND 訊息。 若要清除選取範圍並將追蹤列還原至其原始範圍,請傳送 TBM_CLEARSEL 訊息。
注意
應用程式有責任確保使用者無法選取選取範圍以外的值。 控件本身不會防止用戶移動滑桿超出範圍。
追蹤列通知訊息
追蹤列會傳送WM_HSCROLL或WM_VSCROLL訊息,以通知其用戶動作的父視窗。 具有TBS_HORZ樣式的追蹤列會傳送WM_HSCROLL訊息。 具有TBS_VERT樣式的追蹤列會傳送WM_VSCROLL訊息。 WM_HSCROLL 或 WM_VSCROLL wParam 參數的低序字組包含通知程式代碼。 針對TB_THUMBPOSITION和TB_THUMBTRACK通知代碼,wParam 參數的高階字會指定滑桿的位置。 對於所有其他通知碼,高序字為零; 傳送TBM_GETPOS 訊息,以判斷滑桿位置。 lParam 參數是追蹤列的句柄。
只有當使用者使用鍵盤與追蹤欄互動時,系統才會傳送TB_BOTTOM、TB_LINEDOWN、TB_LINEUP和TB_TOP通知碼。 只有在使用者使用滑鼠時,才會傳送TB_THUMBPOSITION和TB_THUMBTRACK通知碼。 這兩種情況都會傳送TB_ENDTRACK、TB_PAGEDOWN和TB_PAGEUP通知碼。 下表列出追蹤列通知碼和導致 傳送虛擬密鑰碼通知的事件(虛擬密鑰碼或滑鼠事件)。
通知程序代碼 | 已傳送的原因 |
---|---|
TB_BOTTOM | VK_END |
TB_ENDTRACK | WM_KEYUP (使用者釋放了傳送相關虛擬金鑰碼的金鑰 ) |
TB_LINEDOWN | VK_RIGHT或VK_DOWN |
TB_LINEUP | VK_LEFT或VK_UP |
TB_PAGEDOWN | VK_NEXT (使用者按下下方或滑桿右側的頻道) |
TB_PAGEUP | VK_PRIOR (使用者按兩下滑桿上方或左側的通道) |
TB_THUMBPOSITION | 遵循TB_THUMBTRACK通知程式代碼WM_LBUTTONUP |
TB_THUMBTRACK | 滑桿移動 (使用者拖曳滑桿) |
TB_TOP | VK_HOME |
默認追蹤列訊息處理
本節描述追蹤列所執行的視窗訊息處理。
訊息 | 已執行處理 |
---|---|
WM_CAPTURECHANGED | 如果WM_LBUTTONDOWN處理期間設定定時器,並視需要傳送TB_THUMBPOSITION通知碼,則會終止定時器。 它一律會傳送TB_ENDTRACK通知碼。 |
WM_CREATE | 執行其他初始化,例如將行號、頁面大小和刻度標記頻率設定為預設值。 |
WM_DESTROY | 釋放資源。 |
WM_ENABLE | 重新繪出追蹤列視窗。 |
WM_ERASEBKGND | 使用追蹤列的目前背景色彩,清除視窗背景。 |
WM_GETDLGCODE | 傳回DLGC_WANTARROWS值。 |
WM_KEYDOWN | 處理方向鍵,並視需要傳送TB_TOP、TB_BOTTOM、TB_PAGEUP、TB_PAGEDOWN、TB_LINEUP和TB_LINEDOWN通知碼。 |
WM_KEYUP | 如果金鑰是其中一個方向鍵,則傳送TB_ENDTRACK通知碼。 |
WM_KILLFOCUS | 重新繪出追蹤列視窗。 |
WM_LBUTTONDOWN | 將焦點和滑鼠擷取設定為追蹤列。 必要時,它會設定定時器,決定當使用者按住視窗的滑鼠按鈕時,滑桿向滑鼠游標移動的速度。 |
WM_LBUTTONUP | 釋放滑鼠擷取,並在WM_LBUTTONDOWN處理期間設定定時器終止。 如有必要,它會傳送TB_THUMBPOSITION通知碼。 它一律會傳送TB_ENDTRACK通知碼。 |
WM_MOUSEMOVE | 移動滑桿,並在追蹤滑鼠時傳送TB_THUMBTRACK通知碼(請參閱 WM_TIMER)。 |
WM_PAINT | 小畫家 追蹤列。 如果 wParam 參數不是 NULL,控制項會假設此值為 HDC,並使用該裝置內容繪製。 |
WM_SETFOCUS | 重新繪出追蹤列視窗。 |
WM_SIZE | 設定追蹤列的維度,如果沒有足夠的空間顯示滑桿,請移除滑桿。 |
WM_TIMER | 擷取滑鼠位置,並更新滑桿的位置。 (只有在使用者拖曳滑桿時才會收到。 |
WM_WININICHANGE | 初始化滑桿維度。 |
追蹤列工具提示
使用TBS_TOOLTIPS樣式建立的追蹤列具有預設的工具提示控件。 工具提示會保持可見狀態,並在使用者使用滑鼠拖曳滑桿時顯示目前的值。
您可以傳送TBM_SETTOOLTIPS訊息,將新的工具提示控件指派給追蹤列。 若要擷取指派工具提示控件的句柄,請使用 TBM_GETTOOLTIPS 訊息。