共用方式為


關於工具列控制件

工具列是包含一或多個按鈕的控制件。 當使用者按下每個按鈕時,會將命令訊息傳送至父視窗。 通常,工具列中的按鈕對應於應用程式功能表中的項目,為使用者提供其他更直接的方式來存取應用程式的命令。

下列螢幕快照顯示一個視窗,其中包含檔案作業的簡單工具列。 應用程式已啟用可視化樣式。 [儲存] 按鈕是「作用中」,因為游標在拍攝螢幕快照時將游標停留在上方。 控件的實際外觀會根據操作系統和用戶選取的主題而有所不同。

screen shot of a window with a three-button toolbar; one button is hot

下列螢幕快照顯示應用程式中未啟用可視化樣式編譯的相同控件。

screen shot of a window without visual styles: none of the buttons looks hot

下列主題討論規劃工具列時要考慮的功能。 如需實作和範例程式代碼的特定資訊,請參閱 使用工具列控件

指定工具列大小和位置

如果您使用 CreateToolbarEx 建立工具列,函式可讓您以像素為單位指定工具列的高度和寬度。

注意

不建議使用 CreateToolbarEx ,因為它不支援工具列的新功能,包括影像清單。 如需建立工具列的詳細資訊,請參閱 使用工具列控件

 

CreateWindowEx 函式沒有指定工具列大小的參數。 工具列視窗程序會自動設定工具列視窗的大小和位置。 高度是根據工具列中按鈕的高度。 寬度與父視窗工作區的寬度相同。 若要變更自動大小設定,請傳送 TB_SETBUTTONSIZE 訊息。 CCS_TOP和CCS_BOTTOM一般控制件樣式會決定工具列是否位於工作區的頂端或底部。 根據預設,工具列具有 CCS_TOP 樣式。

此外,每當工具列收到 WM_SIZETB_AUTOSIZE 訊息時,工具欄視窗程式會自動調整工具列的大小。 每當父視窗的大小變更或傳送需要調整工具列大小的訊息之後,應用程式應該傳送其中一則訊息,例如 TB_SETBUTTONSIZE 訊息。

您可以藉由設定CCS_NORESIZECCS_NOPARENTALIGN一般控件樣式,來關閉工具列預設重設大小和定位行為。 由 Rebar 控制項裝載的工具列控制項必須設定這些樣式,因為 Rebar 控制件會調整工具列的大小和位置。

透明工具列

工具列控件支援透明外觀,允許工具列下方的工作區顯示。 有兩種透明工具列,一種是一般按鈕,另一種是三維按鈕。 如果您想要讓應用程式符合 Windows 介面,請使用一般透明樣式工具列。

下列螢幕快照顯示兩種透明工具列,而不是使用可視化樣式。

screen shot of two windows with different styles of toolbars, but both toolbars are transparent

下列螢幕快照顯示透明工具列,因為它可能會出現在 Windows Vista 中,並啟用可視化樣式。 對話框的背景色彩已變更,讓透明度更加明顯。

screen shot of a window in windows vista with a transparent toolbar

若要建立透明工具列,您只需要將TBSTYLE_FLATTBSTYLE_TRANSPARENT新增至 CreateWindowEx視窗樣式參數。 如果您不想顯示一行來表示工具列底部,請勿使用 WS_BORDER 視窗樣式。

注意

使用可視化樣式時,工具列預設可能是一般。

 

清單樣式工具列

工具列按鈕可讓您同時顯示文字和點陣圖。 使用 TBSTYLE_LIST 樣式建立之工具列上的按鈕會將文字放在點陣圖右邊,而不是點陣圖下方。

下列螢幕快照顯示具有清單樣式的工具列。

screen shot of a toolbar with text to the right of each icon

您可以使用TBSTYLE_LIST工具列樣式搭配TBSTYLE_FLAT樣式來建立具有平面按鈕的工具列。

定義按鈕影像

有兩種方式可以指定按鈕的影像-位圖或影像清單。 應用程式必須選擇要使用的方法。 它無法使用這兩種方法搭配相同的工具列控制件。 請注意, CreateToolbarEx 函式會使用位圖方法。 想要使用影像清單方法的應用程式必須使用 CreateWindowEx 函式來建立工具列控制件。

使用點陣圖定義按鈕影像

工具列中的每個按鈕都可以包含位圖影像。 工具列會使用內部清單來儲存其繪製影像所需的資訊。 當您呼叫 CreateToolbarEx 函式時,您可以指定包含初始影像的單色或色彩點陣圖,而工具列會將資訊新增至影像的內部清單。 您稍後 可以使用TB_ADDBITMAP 訊息來新增其他影像。

每個影像都有以零起始的索引。 新增至內部清單的第一個影像索引為 0、第二個影像的索引為 1 等等。 TB_ADDBITMAP會將影像新增至清單結尾,並傳回它新增的第一個新影像的索引。 若要將影像與按鈕產生關聯,您必須傳送 TB_ADDBUTTONS 訊息,並在您將點陣圖新增至內部影像清單之後指定影像的索引。

Windows 假設工具列的所有位圖影像大小都相同。 當您使用 CreateToolbarEx 建立工具列時,您可以指定大小。 如果您使用 CreateWindowEx 函式來建立工具列,影像的大小會設定為預設維度 16 x 15 像素。 您可以使用 TB_SETBITMAPSIZE 訊息來變更點圖影像的維度,但您必須這麼做,才能將任何影像新增至內部清單。

使用影像清單定義按鈕影像

您也可以將按鈕影像儲存在一組 影像清單中。 影像清單是相同大小的影像集合,每個影像都可以由其索引參考。 影像清單可用來管理大型圖示集或點陣圖。 您可以使用最多三個不同的影像清單來顯示各種狀態的按鈕,如下表所示。

State 描述
正常 處於預設狀態的按鈕。
經常性 位於指標下或已按下的按鈕。 只有具有 TBSTYLE_FLAT 樣式的工具列控件才支持經常性專案。
停用 已停用的按鈕。

 

工具列終結之後,應用程式必須釋放他們建立的任何影像清單。

定義按鈕的文字

除了影像之外,每個按鈕都可以顯示字串,或而非影像。 工具列會維護內部清單,其中包含工具列按鈕可用的所有字串。 您可以使用TB_ADDSTRING訊息將字串新增至內部清單,並指定要加入之字串的緩衝區位址。 每個字串都必須以 Null 結束,最後一個字串必須以兩個 Null 字元終止。

每個字串都有以零起始的索引。 新增至內部字串清單的第一個字串具有 0 的索引、第二個字串的索引為 1 等等。 TB_ADDSTRING將字串新增至清單結尾,並傳回第一個新字串的索引。 您可以使用字串的索引,將字串與按鈕產生關聯。

使用 TB_ADDSTRING 並不是將字串新增至工具列的唯一方式。 您可以藉由在傳遞至 TB_ADDBUTTONS 之 TBBUTTON 結構的 iString 成員中傳遞字串指標,在按鈕中顯示字串。 此外,您可以使用 TB_SETBUTTONINFO 將文字指派給工具列按鈕。

新增工具列按鈕

如果您使用 CreateToolbarEx 函式來建立工具列,您可以填入 TBBUTTON 結構的陣列,並在函數調用中指定數位的位址,將按鈕新增至工具列。 不過,CreateWindowEx 函式沒有傳遞 TBBUTTON 結構的參數。 CreateWindowEx 會藉由傳送TB_ADDBUTTONS訊息來建立空白工具列,並指定 TBBUTTON 結構的位址

建立工具列之後,您可以傳送TB_INSERTBUTTONTB_ADDBUTTONS訊息來新增按鈕。 每個按鈕都會由 TBBUTTON 結構描述,其會定義按鈕的屬性,包括其字串和點陣陣圖的索引,以及其樣式、狀態、命令標識碼和應用程式定義的32位值。

注意

如果您使用 CreateWindowEx 函式來建立工具列,您必須先傳送TB_BUTTONSTRUCTSIZE訊息,再新增任何按鈕。 訊息會將 TBBUTTON 結構的大小傳遞給工具列。

 

工具列按鈕樣式

按鈕的樣式會決定按鈕的顯示方式,以及它如何回應用戶輸入。 例如, BTNS_BUTTON 樣式會建立類似標準按鈕的工具列按鈕。 具有BTNS_CHECK樣式的按鈕類似於標準推播按鈕,不同之處在於每次使用者按下按鈕時,都會在按下和未壓縮的狀態之間切換。

您可以使用BTNS_GROUPBTNS_CHECKGROUP樣式來建立工具列按鈕群組,例如單選按鈕。 這會導致按鈕保持按下狀態,直到用戶選擇群組中的另一個按鈕為止。 群組會定義為連續的按鈕集合,全都具有 BTNS_GROUPBTNS_CHECKGROUP 樣式。

BTNS_SEP樣式會建立按鈕之間的小間距,或在平面工具列上的按鈕之間繪製刻線。 具有BTNS_SEP樣式的按鈕不會接收用戶輸入。

5.80 版的通用控件引進了一些新的工具列按鈕樣式,並重新命名了一些較舊的樣式。 所有按鈕樣式旗標現在的開頭是BTNS_XXX,而不是TBSTYLE_XXX。 如需按鈕樣式的清單和討論,請參閱 工具列控件和按鈕樣式

工具列按鈕狀態

工具列中的每個按鈕都有狀態。 工具列會更新按鈕的狀態以反映用戶動作,例如按下按鈕。 狀態指出按鈕目前是否已按下、啟用或停用、隱藏或可見。 雖然應用程式會在將按鈕新增至工具列時設定按鈕的初始狀態,但它可以藉由將TB_GETSTATE和TB_SETSTATE訊息傳送至工具列來變更和擷取狀態。 如需工具列按鈕狀態的清單,請參閱 工具列狀態

命令標識碼

每個按鈕都有與其相關聯的應用程式定義命令標識碼。 按鈕識別碼通常定義在應用程式頭檔中。 例如,[貼上] 按鈕可以定義為:

#define ID_PASTE 100

當使用者選取按鈕時,工具列會將包含按鈕命令標識碼的WM_COMMANDWM_NOTIFY訊息傳送給父視窗。 父視窗會檢查命令標識符,並執行與按鈕相關聯的命令。 如需控件何時傳送WM_COMMAND訊息以及傳送WM_NOTIFY的相關信息,請參閱WM_NOTIFY檔的一節。

按鈕大小和位置

工具列會藉由為每個按鈕指派位置索引來追蹤其按鈕。 索引是以零起始的;也就是說,最左邊的按鈕有0的索引、右邊的下一個按鈕有1的索引等等。 當傳送訊息以擷取按鈕的相關信息或設定按鈕的屬性時,應用程式必須指定按鈕的索引。

工具列會在插入和移除按鈕時更新位置索引。 應用程式可以使用TB_COMMANDTOINDEX訊息來擷取按鈕的目前位置索引。 訊息會指定按鈕的命令標識符,而工具列視窗會使用標識符來尋找按鈕並傳回其位置索引。

工具列中的所有按鈕大小都相同。 CreateToolbarEx 函式會要求您在建立工具列時設定按鈕的初始大小。 當您使用 CreateWindowEx 函式時,初始大小會設定為預設維度 24 x 22 圖元。 您可以使用 TB_SETBUTTONSIZE 訊息來變更按鈕大小,但在將任何按鈕新增至工具列之前,您必須先這麼做。 TB_GETITEMRECT訊息會擷取按鈕的目前維度。

當您新增的字串長度超過工具列中目前的任何字串時,工具列會自動重設其按鈕的寬度。 寬度設定為容納工具列中最長的字串。

啟用自定義

工具列具有內建自定義功能,您可以藉由提供工具列 CCS_ADJUSTABLE 通用控件樣式,讓使用者可以使用。 自訂功能可讓使用者將按鈕拖曳至新的位置,或者拖曳出工具列以移除按鈕。 此外,使用者可以按兩下工具列顯示 [自訂工具列] 對話方塊,讓使用者加入、刪除及重新排列工具列按鈕。 若要顯示對話框,請使用 TB_CUSTOMIZE 訊息。 應用程式會決定使用者是否可用自訂功能,以及控制使用者可自訂工具列的範圍。

在自定義程式中,應用程式通常需要儲存和還原工具列的狀態。 例如,許多應用程式會在用戶開始自定義工具列之前儲存工具列狀態,以防使用者稍後想要將工具列還原為其原始狀態。 工具列控件不會自動保留其預先自定義狀態的記錄。 您的應用程式必須儲存工具列狀態,才能還原它。 如需詳細資訊,請參閱 使用工具列控件

啟用熱追蹤

熱追蹤表示當指標移至專案上方時,按鈕的外觀就會變更。 啟用可視化樣式時,工具列預設支持熱追蹤。 否則,只有使用TBSTYLE_FLAT樣式建立的工具列控件支援熱追蹤。 您可以使用其他視窗樣式搭配 TBSTYLE_FLAT 來產生啟用熱追蹤但與一般工具列不同的外觀工具列。 如需詳細資訊,請參閱 使用工具列控件