關於索引標籤控件

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

下列螢幕快照顯示包含一周天數索引標籤的簡單索引標籤件。 已選取 [星期二] 索引標籤。

screen shot of a property sheet with five tabs, one for each day of the week

本主題包括下列各節。

建立索引標籤控件

您可以藉由呼叫 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樣式,指定父視窗繪製控件中的索引標籤。 如需詳細資訊,請參閱 擁有者繪製索引標籤

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

索引標籤和索引標籤屬性

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

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

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

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

應用程式定義的數據是由TCITEM結構的 lParam 成員所指定。 如果您使用超過 4 個字節的應用程式定義數據,則需要定義自己的結構,並使用它,而不是 TCITEM。 您可以使用TCM_GETITEMTCM_SETITEM訊息,以擷取和設定索引標籤的其他資訊的方式擷取和設定應用程式定義數據。

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

顯示區域

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

有時候顯示區域必須是特定大小,例如無模式子對話框的大小。 假設顯示區域的周框,您可以使用 TCM_ADJUSTRECT 來計算選項卡控件的對應視窗矩形。

索引標籤選取

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

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

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

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

索引標籤控件影像清單

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

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

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

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

索引標籤大小和位置

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

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

您可以使用TCM_GETITEMRECT訊息來判斷索引標籤的目前周框。 您可以使用TCM_HITTEST訊息,判斷位於指定位置的索引標籤。

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

擁有者繪製的索引標籤

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

根據預設,DRAWITEMSTRUCTitemData 成員包含 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 重新計算索引標籤的位置,並可能會使索引標籤控件的一部分失效,以強制重新繪製部分或所有索引標籤。