關於工具列控制件
工具列是包含一或多個按鈕的控制件。 當使用者按下每個按鈕時,會將命令訊息傳送至父視窗。 通常,工具列中的按鈕對應於應用程式功能表中的項目,為使用者提供其他更直接的方式來存取應用程式的命令。
下列螢幕快照顯示一個視窗,其中包含檔案作業的簡單工具列。 應用程式已啟用可視化樣式。 [儲存] 按鈕是「作用中」,因為游標在拍攝螢幕快照時將游標停留在上方。 控件的實際外觀會根據操作系統和用戶選取的主題而有所不同。
下列螢幕快照顯示應用程式中未啟用可視化樣式編譯的相同控件。
下列主題討論規劃工具列時要考慮的功能。 如需實作和範例程式代碼的特定資訊,請參閱 使用工具列控件。
指定工具列大小和位置
如果您使用 CreateToolbarEx 建立工具列,函式可讓您以像素為單位指定工具列的高度和寬度。
注意
不建議使用 CreateToolbarEx ,因為它不支援工具列的新功能,包括影像清單。 如需建立工具列的詳細資訊,請參閱 使用工具列控件。
CreateWindowEx 函式沒有指定工具列大小的參數。 工具列視窗程序會自動設定工具列視窗的大小和位置。 高度是根據工具列中按鈕的高度。 寬度與父視窗工作區的寬度相同。 若要變更自動大小設定,請傳送 TB_SETBUTTONSIZE 訊息。 CCS_TOP和CCS_BOTTOM一般控制件樣式會決定工具列是否位於工作區的頂端或底部。 根據預設,工具列具有 CCS_TOP 樣式。
此外,每當工具列收到 WM_SIZE 或 TB_AUTOSIZE 訊息時,工具欄視窗程式會自動調整工具列的大小。 每當父視窗的大小變更或傳送需要調整工具列大小的訊息之後,應用程式應該傳送其中一則訊息,例如 TB_SETBUTTONSIZE 訊息。
您可以藉由設定CCS_NORESIZE和CCS_NOPARENTALIGN一般控件樣式,來關閉工具列預設重設大小和定位行為。 由 Rebar 控制項裝載的工具列控制項必須設定這些樣式,因為 Rebar 控制件會調整工具列的大小和位置。
透明工具列
工具列控件支援透明外觀,允許工具列下方的工作區顯示。 有兩種透明工具列,一種是一般按鈕,另一種是三維按鈕。 如果您想要讓應用程式符合 Windows 介面,請使用一般透明樣式工具列。
下列螢幕快照顯示兩種透明工具列,而不是使用可視化樣式。
下列螢幕快照顯示透明工具列,因為它可能會出現在 Windows Vista 中,並啟用可視化樣式。 對話框的背景色彩已變更,讓透明度更加明顯。
若要建立透明工具列,您只需要將TBSTYLE_FLAT或TBSTYLE_TRANSPARENT新增至 CreateWindowEx 的視窗樣式參數。 如果您不想顯示一行來表示工具列底部,請勿使用 WS_BORDER 視窗樣式。
注意
使用可視化樣式時,工具列預設可能是一般。
清單樣式工具列
工具列按鈕可讓您同時顯示文字和點陣圖。 使用 TBSTYLE_LIST 樣式建立之工具列上的按鈕會將文字放在點陣圖右邊,而不是點陣圖下方。
下列螢幕快照顯示具有清單樣式的工具列。
您可以使用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_INSERTBUTTON或TB_ADDBUTTONS訊息來新增按鈕。 每個按鈕都會由 TBBUTTON 結構描述,其會定義按鈕的屬性,包括其字串和點陣陣圖的索引,以及其樣式、狀態、命令標識碼和應用程式定義的32位值。
注意
如果您使用 CreateWindowEx 函式來建立工具列,您必須先傳送TB_BUTTONSTRUCTSIZE訊息,再新增任何按鈕。 訊息會將 TBBUTTON 結構的大小傳遞給工具列。
工具列按鈕樣式
按鈕的樣式會決定按鈕的顯示方式,以及它如何回應用戶輸入。 例如, BTNS_BUTTON 樣式會建立類似標準按鈕的工具列按鈕。 具有BTNS_CHECK樣式的按鈕類似於標準推播按鈕,不同之處在於每次使用者按下按鈕時,都會在按下和未壓縮的狀態之間切換。
您可以使用BTNS_GROUP或BTNS_CHECKGROUP樣式來建立工具列按鈕群組,例如單選按鈕。 這會導致按鈕保持按下狀態,直到用戶選擇群組中的另一個按鈕為止。 群組會定義為連續的按鈕集合,全都具有 BTNS_GROUP 或 BTNS_CHECKGROUP 樣式。
BTNS_SEP樣式會建立按鈕之間的小間距,或在平面工具列上的按鈕之間繪製刻線。 具有BTNS_SEP樣式的按鈕不會接收用戶輸入。
5.80 版的通用控件引進了一些新的工具列按鈕樣式,並重新命名了一些較舊的樣式。 所有按鈕樣式旗標現在的開頭是BTNS_XXX,而不是TBSTYLE_XXX。 如需按鈕樣式的清單和討論,請參閱 工具列控件和按鈕樣式。
工具列按鈕狀態
工具列中的每個按鈕都有狀態。 工具列會更新按鈕的狀態以反映用戶動作,例如按下按鈕。 狀態指出按鈕目前是否已按下、啟用或停用、隱藏或可見。 雖然應用程式會在將按鈕新增至工具列時設定按鈕的初始狀態,但它可以藉由將TB_GETSTATE和TB_SETSTATE訊息傳送至工具列來變更和擷取狀態。 如需工具列按鈕狀態的清單,請參閱 工具列狀態。
命令標識碼
每個按鈕都有與其相關聯的應用程式定義命令標識碼。 按鈕識別碼通常定義在應用程式頭檔中。 例如,[貼上] 按鈕可以定義為:
#define ID_PASTE 100
當使用者選取按鈕時,工具列會將包含按鈕命令標識碼的WM_COMMAND或WM_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 來產生啟用熱追蹤但與一般工具列不同的外觀工具列。 如需詳細資訊,請參閱 使用工具列控件。