共用方式為


關於索引標籤控件

索引標籤機控件類似於筆記本中的分隔符或檔案櫃中的標籤。 藉由使用索引標籤件,應用程式可以針對視窗或對話框的相同區域定義多個頁面。 每個頁面都包含特定類型的資訊或應用程式在用戶選取對應索引標籤時所顯示的控件群組。

以下截圖顯示一個包含一周天數索引標籤的簡單索引標籤控制項。 已選擇「星期二」標籤頁。

屬性表的螢幕快照,其中有五個索引標籤,每個索引標籤代表一週中的一天

本主題包含下列各節。

建立標籤頁控制項

您可以呼叫 CreateWindowEx 函式,指定 WC_TABCONTROL 視窗類別,以建立標籤控制項。 載入通用控制項 DLL 時,會註冊此視窗類別。 若要確保載入 DLL,請使用 InitCommonControlsEx 函式。

在 Microsoft Visual Studio 中,您可以使用工具箱建立索引標籤控制項。

您會將訊息傳送至標籤控制項,以新增標籤或影響控制項的外觀和行為。 每則訊息都有一個對應的巨集,您可以使用此巨集來代替直接發送訊息。 您無法停用索引標籤控制項中的個別索引標籤。 不過,您可以透過停用對應的頁面來停用屬性表中的分頁控制項。

Tab 控件樣式

您可以藉由在建立控制項時指定索引標籤控件樣式,將特定特性套用至索引標籤控制件。 例如,您可以在索引標籤控件中指定索引標籤的對齊方式和一般外觀。

您可以藉由指定 TCS_BUTTONS 樣式,讓索引標籤看起來像按鈕。 這種類型的索引標籤控件中的索引標籤應該提供與按鈕控制件相同的功能;也就是說,按兩下索引標籤應該執行命令,而不是顯示頁面。 因為按鈕索引標籤控件中的顯示區域通常不會使用,所以不會在它周圍繪製任何框線。

您可以藉由指定 TCS_FOCUSONBUTTONDOWN 樣式,讓索引標籤在按下時接收輸入焦點。 此樣式通常只能與 TCS_BUTTONS 樣式搭配使用。 您可以使用 TCS_FOCUSNEVER 樣式,指定索引標籤在被按下時不會接收輸入焦點。

根據預設,索引標籤控件只會顯示一列索引標籤。 如果沒有一次顯示所有索引標籤,索引標籤控件會顯示上下控件,讓使用者可以將其他索引卷動到檢視中。 您可以藉由指定 TCS_MULTILINE 樣式,來使得標籤頁控制視需要顯示多行索引標籤。 使用此樣式時,可以一次顯示所有索引標籤。 除非您指定 TCS_RIGHTJUSTIFY 樣式,否則索引標籤會在每個數據列內靠左對齊。 在此情況下,會增加每個索引標籤的寬度,讓每個索引標籤列填滿選項卡控制件的整個寬度。

索引標籤控件會自動調整每個索引標籤的大小,使其符合其圖示,如果有的話,以及其標籤。 若要提供所有索引標籤相同的寬度,您可以指定 TCS_FIXEDWIDTH 樣式。 控件會調整所有索引標籤的大小,以符合最寬的標籤,或者您可以使用 TCM_SETITEMSIZE 訊息來指派特定的寬度和高度。 在每個索引標籤內,控件會將圖示和標籤置中,並將圖示放在標籤的左邊。 您可以指定樣式 TCS_FORCEICONLEFT,強制將圖示移至左側,同時將標籤置中。 您可以使用 TCS_FORCELABELLEFT 樣式,讓圖示和標籤保持靠左對齊。 您無法將 TCS_FIXEDWIDTH 樣式與 TCS_RIGHTJUSTIFY 樣式搭配使用。

您可以使用 TCS_OWNERDRAWFIXED 樣式來指定由父視窗在控制項中繪製標籤頁。 如需詳細資訊,請參閱 Owner-Drawn 索引標籤

您可以使用 TCS_TOOLTIPS 樣式,指定 Tab 控制項將建立工具提示控制項。 如需詳細資訊,請參閱 Tab 控制件工具提示

索引標籤和索引標籤屬性

標籤控制項中的每個標籤都包含圖示、標籤和應用程式定義的資料。 這項資訊是由 TCITEM 結構所指定。 您可以將索引標籤新增至索引標籤控件、擷取索引標籤、擷取和設定索引標籤的內容,以及刪除索引標籤。 索引標籤會以其以零起始的索引來識別。

若要將索引標籤新增至索引標籤控件,請使用 TCM_INSERTITEM 訊息,指定專案的位置,以及 TCITEM結構的位址。 您可以使用 TCM_GETITEMTCM_SETITEM 訊息來擷取和設定現有索引標籤的內容。 針對每個索引標籤,您可以指定圖示、標籤或兩者。 您也可以指定要與索引標籤建立關聯的應用程式定義數據。

您可以使用 TCM_GETITEMCOUNT 訊息擷取目前的索引標籤、使用 TCM_DELETEITEM 訊息刪除索引標籤,以及使用 TCM_DELETEALLITEMS 訊息刪除索引標籤控件中的所有索引標籤。

您可以將應用程式定義的數據與每個索引標籤產生關聯。例如,您可以使用其對應的索引標籤來儲存每個頁面的相關信息。根據預設,索引標籤控件會為每個索引標籤配置四個額外的位元組,以供應用程式定義的數據使用。 您可以使用 TCM_SETITEMEXTRA 訊息來變更每個索引標籤的額外位元組數目。 當索引標籤控件是空的時,您只能使用此訊息。

應用程式定義的數據是由 TCITEM 結構的 lParam 成員所指定。 如果您使用超過 4 bytes 的應用程式定義資料,您需要定義自己的結構,並使用它來替代 TCITEM。 您可以使用 TCM_GETITEMTCM_SETITEM 訊息,以與擷取和設定索引標籤其他資訊相同的方式,擷取和設定應用程式定義的資料。

結構的第一個成員必須是 TCITEMHEADER 結構,其餘成員必須指定應用程式定義的數據。 TCITEMHEADERTCITEM相同,但 lParam 成員除外。 結構大小與 TCITEMHEADER 大小之間的差異, 應等於每個索引標籤的額外位元組數目。

顯示區域

索引標籤的顯示區域是應用程式顯示目前頁面的區域。 一般而言,應用程式會建立子視窗或對話框,並將視窗大小和位置設定為符合顯示區域。 指定選項卡控制件的視窗矩形,您可以使用 TCM_ADJUSTRECT 訊息來計算顯示區域的周框。

有時候顯示區域必須是特定大小,例如無模式子對話框的大小。 給定顯示區域的邊界矩形,您可以使用 TCM_ADJUSTRECT 來計算標籤控制項的對應視窗矩形。

索引標籤選取

當使用者選取索引標籤時,索引標籤控件會以 WM_NOTIFY 訊息的形式傳送其父視窗通知碼。 TCN_SELCHANGING 通知碼會在選取變更之前傳送,而當選取變更之後,會傳送 TCN_SELCHANGE 通知碼。

您可以處理 TCN_SELCHANGING 以儲存傳出頁面的狀態。 您可以傳回 true ,以防止選取範圍變更。 例如,您可能不想從控件具有無效設定的子對話框切換。

您必須處理 TCN_SELCHANGE,才能在顯示區域中顯示內送頁面。 這可能只需變更子視窗中顯示的資訊。 每個頁面通常會由子視窗或對話框所組成。 在此情況下,應用程式可能會終結或隱藏傳出子視窗或對話框,以及建立或顯示傳入子視窗或對話框,來處理此通知。

您可以使用 TCM_GETCURSELTCM_SETCURSEL 訊息來擷取和設定目前的選取範圍。

標籤控制圖片清單

每個索引標籤都可以有一個與其相關聯的圖示,此圖示由索引標籤控制元件的影像清單中的索引指定。 建立索引標籤控件時,它沒有與其相關聯的影像清單。 應用程式可以使用 ImageList_Create 函式建立影像清單,然後使用 TCM_SETIMAGELIST 訊息將它指派給索引標籤控件。

您可以將影像新增至索引卷標控件的影像清單,就像將影像新增至任何其他影像清單一樣。 不過,應用程式應該使用 TCM_REMOVEIMAGE 訊息來移除映像,而不是使用 ImageList_Remove 函式。 此訊息可確保每個索引標籤都與先前相同的影像保持關聯。

終結索引標籤控件並不會終結與其相關聯的影像清單。 您必須分別刪除映像清單。 如果您想要將相同的影像清單指派給多個頁籤控制項,這會很有用。

若要擷取目前與索引標籤相關聯的影像清單句柄,您可以使用 TCM_GETIMAGELIST 訊息。

索引標籤大小和位置

Tab 控制件中的每個索引標籤都有大小和位置。 您可以設定索引標籤的大小、擷取索引標籤的周框,或判斷哪個索引標籤位於指定的位置。

固定寬度和自定義繪製的索引標籤控制項,您可以使用 TCM_SETITEMSIZE 訊息來設定索引標籤的確切寬度和高度。 在其他索引標籤控件中,會根據索引標籤的圖示和標籤來計算每個索引標籤的大小。索引標籤包含框線的空間和其他邊界。 您可以使用 TCM_SETPADDING 訊息來設定邊界的粗細。

您可以使用 TCM_GETITEMRECT 訊息來確定索引標籤的目前邊界矩形。 您可以使用 TCM_HITTEST 訊息,判斷位於指定位置的是哪個索引標籤,如果有的話。

在具有 TCS_MULTILINE 樣式的索引標籤中,您可以使用 TCM_GETROWCOUNT 訊息來判斷目前索引標籤的數據列數目。

Owner-Drawn 索引標籤

如果索引標籤具有 TCS_OWNERDRAWFIXED 樣式,父視窗必須藉由處理 WM_DRAWITEM 訊息來繪製索引標籤。 每當需要繪製索引標籤時,Tab 控制件就會傳送此訊息。 lParam 參數會指定 DRAWITEMSTRUCT 結構的位址,其中包含標籤的索引、其邊界矩形,以及要繪製的設備上下文(DC)。

根據預設,itemData 成員位於 DRAWITEMSTRUCT,包含 TCITEM 結構的 lParam 成員值。 不過,如果您變更每個索引標籤的應用程式定義資料量,itemData 會改為包含該資料的位址。 您可以使用 TCM_SETITEMEXTRA 訊息,變更每個索引標籤的應用程式定義數據量。

若要指定索引標籤的專案大小,父視窗必須處理 WM_MEASUREITEM 訊息。 因為擁有者繪製索引標籤控件中的所有索引標籤大小都相同,因此只會傳送此訊息一次。 擁有者繪製的索引標籤沒有不同大小的索引標籤控件樣式。 您也可以使用 TCM_SETITEMSIZE 訊息來設定索引標籤的寬度和高度。

分頁控制項工具提示

您可以使用工具提示控制項來提供索引標籤中每個索引標籤的簡短描述。 具有 TCS_TOOLTIPS 樣式的索引標籤控制項會在其建立時建立工具提示控制項,並在其銷毀時銷毀工具提示控制項。 您也可以建立工具提示控件,並將它指派給索引標籤控制件。

如果您使用工具提示控件搭配索引標籤件,父視窗必須處理 TTN_GETDISPINFO 通知程式代碼,以提供每個索引標籤的描述。

若要搭配多個選項卡控件使用相同的工具提示控件,請自行建立工具提示控件,並使用 TCM_SETTOOLTIPS 訊息將它指派給選項卡控件。 您可以使用 TCM_GETTOOLTIPS 訊息,擷取選項卡控件目前工具提示控件的句柄。 如果您建立自己的工具提示控件,則不應該使用 TCS_TOOLTIPS 樣式。

默認索引標籤控件訊息處理

本節描述索引標籤控件所執行的訊息處理。 本檔的其他章節會討論 Tab 控制件特有的訊息。

消息 處理已完成
WM_CAPTURECHANGED 如果 Tab 控制項自行釋放了滑鼠擷取,則不會執行任何動作。 如果另一個視窗擷取滑鼠並按住按鈕,命令就會放開按鈕。
WM_CREATE 配置和初始化內部數據結構。 如果指定 TCS_TOOLTIPS 樣式,控件會建立工具提示控件。
WM_DESTROY 釋放在執行 WM_CREATE 處理期間分配的資源。
WM_GETDLGCODE 傳回DLGC_WANTARROWS和DLGC_WANTCHARS值的組合。
WM_GETFONT 將句柄傳回用於標籤的字型。
WM_KEYDOWN 視需要處理方向索引鍵並變更選取範圍。
WM_KILLFOCUS 將焦點所在的標籤設為無效,以便重新繪製來顯示未聚焦狀態。
WM_LBUTTONDOWN 將訊息轉送至工具提示控件,如果有的話,並在使用者點擊索引標籤時變更選取範圍。如果使用者點擊按鈕,控件會重新繪製按鈕,以呈現凹陷的外觀並捕捉滑鼠。 如果使用者按下索引標籤或按鈕,並指定 TCS_FOCUSONBUTTONDOWN 樣式,控件會將焦點設定為本身。
WM_LBUTTONUP 如果按鈕被按下,則放開滑鼠。 如果游標位於按鈕上方並按住,控件會據以變更選取範圍,並重新繪製按鈕。
WM_MOUSEMOVE 如果有的話,將訊息轉送至工具提示控件。 如果指定了 TCS_BUTTONS 樣式,且滑鼠按鈕在按兩下之後會按住,控件也可以重新繪製受影響的按鈕,使其出現凸起或沉沒的外觀。
WM_NOTIFY 轉送工具提示控件所傳送的通知代碼。
WM_PAINT 在顯示區域周圍繪製框線(除非指定 TCS_BUTTONS 樣式),並繪製任何與無效矩形交集的索引標籤。 針對每個標籤頁,它會繪製標籤頁的正文(或將 WM_DRAWITEM 訊息傳送至父視窗),然後在標籤周圍繪製邊框。如果 wParam 參數非 NULL,控制項會假定該值為 HDC 並使用該裝置內容進行繪製。
WM_RBUTTONDOWN NM_RCLICK 通知碼傳送至父視窗。
WM_SETFOCUS 使具有焦點的索引標籤無效化,以便重新描繪以反映焦點狀態。
WM_SETFONT 設定用於標籤的字型。
WM_SETREDRAW 設定一個內部旗標的狀態,此旗標會決定在插入或刪除專案時、變更字型時等情況下,控制項是否需要重新繪製。
WM_SIZE 重新計算索引標籤的位置,並可能會使索引標籤控件的一部分失效,以強制重新繪製部分或所有索引標籤。