關於索引標籤控制項

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

下列螢幕擷取畫面顯示包含一周天數索引標籤的簡單索引標籤控制項。 已選取 [星期二] 索引標籤。

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_RIGHTJUSTIFY樣式使用TCS_FIXEDWIDTH樣式。

您可以使用 TCS_OWNERDRAWFIXED 樣式,指定父視窗繪製控制項中的索引標籤。 如需詳細資訊,請參閱 擁有者繪製的索引標籤

您可以使用 TCS_TOOLTIPS 樣式來指定索引標籤控制項會建立工具提示控制項。 如需詳細資訊,請參閱 Tab 控制項工具提示

索引標籤和索引標籤屬性

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

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

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

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

應用程式定義的資料是由TCITEM結構的lParam成員所指定。 如果您使用超過 4 個位元組的應用程式定義資料,則必須定義自己的結構,並使用它,而不是 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 訊息來繪製索引標籤。 每當需要繪製索引標籤時,索引標籤控制項就會傳送此訊息。 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 如果索引標籤控制項放開滑鼠擷取本身,則不會執行任何動作。 如果另一個視窗擷取滑鼠並按住按鈕,命令會釋放按鈕。
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 重新計算索引標籤的位置,並可能會使索引標籤控制項的一部分失效,以強制重新繪製部分或所有索引標籤。