タブコントロールの概要

タブ コントロールは、ノートの仕切ページまたはファイル キャビネットのラベルに似ています。 タブ コントロールを使用すると、アプリケーションでウィンドウまたはダイアログ ボックスの同じ領域に複数のページを定義できます。 各ページは、ユーザーが対応するタブを選択したときにアプリケーションが表示する、特定の種類の情報またはコントロールのグループで構成されます。

次のスクリーンショットは、曜日のタブを含む簡単なタブコントロールを示しています。 [火曜日] タブが選択されています。

5つのタブがあるプロパティシートのスクリーンショット (曜日ごとに1つ)

このトピックのセクションは次のとおりです。

作成 (タブコントロールを)

CreateWindowEx関数を呼び出して、 WC _ TABCONTROLウィンドウクラスを指定することで、タブコントロールを作成できます。 このウィンドウクラスは、コモンコントロール DLL が読み込まれるときに登録されます。 DLL が読み込まれるようにするには、 Initcommoncontrolsex 関数を使用します。

Microsoft Visual Studio では、ツールボックスを使用してタブコントロールを作成できます。

タブを追加するためにメッセージをタブコントロールに送信し、それ以外の場合はコントロールの外観と動作に影響を与えます。 各メッセージには、メッセージを明示的に送信する代わりに使用できる、対応するマクロがあります。 タブコントロールの個々のタブを無効にすることはできません。 ただし、対応するページを無効にすることで、プロパティシートのタブコントロールを無効にすることができます。

タブコントロールのスタイル

コントロールの作成時にタブコントロールスタイルを指定することによって、タブコントロールに特定の特性を適用できます。 たとえば、タブコントロールのタブの配置と一般表示を指定できます。

TCS _ ボタンのスタイルを指定すると、タブをボタンのように表示させることができます。 この種類のタブコントロールのタブは、ボタンコントロールと同じ機能を提供する必要があります。つまり、タブをクリックすると、ページを表示するのではなく、コマンドが実行されます。 ボタンタブコントロールの表示領域は通常は使用されないため、周囲に境界線は描画されません。

クリックすると、 TCS _ FOCUSONBUTTONDOWN スタイルを指定することによって、タブの入力フォーカスを受け取ることができます。 通常、このスタイルは、 TCS _ ボタン スタイルでのみ使用されます。 TCS _ FOCUSNEVERスタイルを使用してクリックしたときに、タブが入力フォーカスを受け取らないように指定できます。

既定では、タブコントロールには1行のタブのみが表示されます。 すべてのタブを一度に表示できない場合は、タブコントロールにアップダウンコントロールが表示され、ユーザーは追加のタブをスクロールして表示できるようになります。 必要に応じて、複数行のタブを表示するようにするには、 [行 _ 1] スタイルを 指定します。 このスタイルでは、すべてのタブを一度に表示できます。 このタブは、[ TCS の _ 右揃え ] スタイルを指定しない限り、各行に左揃えで配置されます。 この場合、タブの各行がタブコントロールの幅全体を占めるように、各タブの幅が大きくなります。

タブコントロールでは、各タブのサイズがアイコンに合わせて自動的に調整され、ラベルが設定されます。 すべてのタブに同じ幅を設定するには、[ TCS _ fixedwidth ] スタイルを指定します。 コントロールでは、すべてのタブのサイズが最も広いラベルに合わせて調整されます。または、 TCM _ SETITEMSIZE メッセージを使用して、特定の幅と高さを割り当てることができます。 各タブ内で、コントロールはアイコンとラベルを中央揃えにして、ラベルの左側にアイコンを配置します。 TCS _ forceiconleftスタイルを指定することで、ラベルを中央に残したまま、アイコンを左に配置できます。 TCS _ FORCELABELLEFTスタイルを使用して、アイコンとラベルの両方を左揃えにすることができます。 Tcs _ fixedwidth スタイルは、 tcs の _ 右揃え スタイルでは使用できません。

親ウィンドウが、 TCS _ ownerdrawfixed スタイルを使用して、コントロールのタブを描画するように指定できます。 詳細については、「 オーナー描画タブ」を参照してください。

タブコントロールで、 TCS _ ツールヒント スタイルを使用して、ツールヒントコントロールを作成するように指定できます。 詳細については、「 タブコントロールのツールヒント」を参照してください。

タブとタブの属性

タブコントロールの各タブは、アイコン、ラベル、およびアプリケーション定義データで構成されています。 この情報は、 TCITEM 構造体によって指定されます。 タブコントロールにタブを追加したり、タブの数を取得したり、タブの内容を取得および設定したり、タブを削除したりできます。 タブは、0から始まるインデックスによって識別されます。

タブコントロールにタブを追加するには、項目の位置と TCITEM構造体のアドレスを指定して、 TCM _ INSERTITEMメッセージを使用します。 Tcm の _ GETITEMおよび tcm _ SETITEMメッセージを使用して、既存のタブの内容を取得および設定できます。 各タブには、アイコン、ラベル、またはその両方を指定できます。 また、このタブに関連付けられるアプリケーション定義データを指定することもできます。

Tcm _ GETITEMCOUNT メッセージを使用して現在のタブ数を取得したり、 tcm _ DELETEITEM メッセージを使用してタブを削除したり、 tcm _ DELETEALLITEMS メッセージを使用してタブコントロール内のすべてのタブを削除したりできます。

アプリケーション定義データは、各タブに関連付けることができます。たとえば、各ページに関する情報を、対応するタブと共に保存することができます。既定では、タブコントロールは、アプリケーション定義データのタブごとに4つの追加バイトを割り当てます。 1つのタブあたりの余分なバイト数は、 TCM _ SETITEMEXTRA メッセージを使用して変更できます。 このメッセージは、タブコントロールが空の場合にのみ使用できます。

アプリケーション定義データは、 TCITEM構造体の lParam メンバーによって指定されます。 4バイトを超えるアプリケーション定義データを使用する場合は、独自の構造体を定義し、 TCITEM の代わりに使用する必要があります。 Tcm _ GETITEMおよび tcm _ SETITEMメッセージを使用して、タブに関する他の情報を取得して設定するのと同じ方法で、アプリケーション定義データを取得して設定できます。

構造体の最初のメンバーは Tcitemheader 構造体である必要があり、残りのメンバーはアプリケーション定義データを指定する必要があります。 TcitemheaderTCITEMと同じですが、 lParam メンバーが含まれていない点が異なります。 構造体のサイズと Tcitemheader のサイズの違いは、タブあたりの余分なバイト数と同じである必要があります。

表示領域

タブコントロールの表示領域は、アプリケーションによって現在のページが表示される領域です。 通常、アプリケーションでは、子ウィンドウまたはダイアログボックスを作成して、表示領域に合わせてウィンドウのサイズと位置を設定します。 タブコントロールのウィンドウ四角形を指定すると、 TCM _ ADJUSTRECT メッセージを使用して、表示領域の外接する四角形を計算できます。

場合によっては、表示領域が特定のサイズである必要があります (たとえば、モードレスの子ダイアログボックスのサイズ)。 表示領域に外接する四角形を指定すると、 TCM _ ADJUSTRECT を使用して、タブコントロールの対応するウィンドウ四角形を計算できます。

タブの選択

ユーザーがタブを選択すると、タブコントロールは、その親ウィンドウの通知コードを WM _ 通知 メッセージの形式で送信します。 Tcn _ selchanging通知コードは選択内容が変更される前に送信され、 tcn _ selchanging通知コードは選択の変更後に送信されます。

Tcn _ selchangingを処理して、送信ページの状態を保存できます。 選択が変更されないようにするには、 TRUE を返すことができます。 たとえば、コントロールの設定が無効になっている子ダイアログボックスから切り替えることはできません。

表示領域に着信ページを表示するには、 Tcn _ selchange を処理する必要があります。 これは、子ウィンドウに表示される情報の変更が必要になる場合があります。 多くの場合、各ページは子ウィンドウまたはダイアログボックスで構成されています。 この場合、アプリケーションは、送信子ウィンドウまたはダイアログボックスを破棄または非表示にし、受信子ウィンドウまたはダイアログボックスを作成または表示することによって、この通知を処理することがあります。

現在選択されている項目を取得して設定するには、 tcm _ getcursel および tcm _ setcursel メッセージを使用します。

タブコントロールのイメージリスト

各タブには、タブコントロールのイメージリストのインデックスによって指定されたアイコンを関連付けることができます。 作成されたタブコントロールには、イメージリストが関連付けられていません。 アプリケーションでは、 ImageList _ create 関数を使用してイメージリストを作成し、 TCM _ SETIMAGELIST メッセージを使用してそれをタブコントロールに割り当てることができます。

他のイメージリストの場合と同様に、タブコントロールのイメージリストにイメージを追加できます。 ただし、アプリケーションでは、 ImageList _ remove関数の代わりに TCM _ removeimageメッセージを使用してイメージを削除する必要があります。 このメッセージは、各タブが以前と同じイメージに関連付けられていることを確認します。

タブコントロールを破棄しても、関連付けられているイメージリストは破棄されません。 イメージ リストは個別に破棄する必要があります。 これは、同じイメージ リストを複数のタブ コントロールに割り当てる場合に便利です。

タブ コントロールに現在関連付けられているイメージ リストのハンドルを取得するには 、TCM _ GETIMAGELIST メッセージを使用 できます。

タブのサイズと位置

タブ コントロールの各タブには、サイズと位置があります。 タブのサイズを設定したり、タブの外接する四角形を取得したり、指定した位置にあるタブを決定することができます。

固定幅および所有者描画タブ コントロールの場合は 、TCM _ SETITEMSIZE メッセージを使用してタブの正確な幅と高さを設定できます。 他のタブ コントロールでは、各タブのサイズは、タブのアイコンとラベルに基づいて計算されます。タブ コントロールには、境界線用のスペースと追加の余白が含まれています。 TCM _ SETPADDINGメッセージを使用して、余白の太さを設定できます。

TCM _ GETITEMRECTメッセージを使用して、タブの現在の外接する四角形を特定できます。 TCM _ HITTESTメッセージを使用して、指定した場所にあるタブ (ある場合) を特定できます。

TCS _ MULTILINEスタイルのタブ コントロールでは 、TCM _ GETROWCOUNTメッセージを使用して、タブの現在の行数を確認できます。

Owner-Drawnタブ

タブ コントロールに TCS _ OWNERDRAWFIXED スタイルがある場合、親ウィンドウは WM DRAWITEM メッセージを処理してタブ _ を描画する必要 があります。 タブ コントロールは、タブを描画する必要があるときに常にこのメッセージを送信します。 lParam パラメーター は、タブのインデックス、その外接する四角形、および描画するデバイス コンテキスト (DC) を含む DRAWITEMSTRUCT構造体のアドレスを指定します。

既定では 、DRAWITEMSTRUCT の itemData メンバーには 、TCITEM構造体の lParam メンバーの値が含まれている。 ただし、タブごとにアプリケーション定義データの量を変更した場合 、itemData には代わりにデータのアドレスが含されます。 TCM _ SETITEMEXTRAメッセージを使用して、タブあたりのアプリケーション定義データの量を変更できます。

タブ コントロール内の項目のサイズを指定するには、親ウィンドウで WM _ MEASUREITEM メッセージを処理する必要 があります。 所有者描画タブ コントロール内のすべてのタブは同じサイズなので、このメッセージは 1 回だけ送信されます。 サイズが異なる所有者描画タブのタブ コントロール スタイルはありません。 TCM _ SETITEMSIZEメッセージを使用して、タブの幅と高さを設定することもできます。

タブ コントロールのヒント

ツールヒント コントロールを使用すると、タブ コントロール内の各タブについて簡単に説明できます。 TCS _ TOOLTIPSスタイルを持つタブ コントロールでは、ツールヒント コントロールの作成時にツールヒント コントロールが作成され、破棄されるとツールヒント コントロールが破棄されます。 ツールヒント コントロールを作成し、タブ コントロールに割り当てすることもできます。

タブ コントロールでツールヒント コントロールを使用する場合、親ウィンドウは TTN _ GETDISPINFO 通知コードを処理して、要求に応じて各タブの説明を提供する必要があります。

複数のタブ コントロールで同じツールヒント コントロールを使用するには、ツールヒント コントロールを自分で作成し 、TCM _ SETTOOLTIPS メッセージを使用してタブ コントロールに割り当てる必要があります。 TCM _ GETTOOLTIPSメッセージを使用して、タブ コントロールの現在のツールヒント コントロールへのハンドルを取得できます。 独自のツールヒント コントロールを作成する場合は 、TCS _ ツールヒント スタイルを使用 することはできません。

既定のタブ コントロールのメッセージ処理

このセクションでは、タブ コントロールによって実行されるメッセージ処理について説明します。 タブ コントロールに固有のメッセージについては、このドキュメントの他のセクションで説明します。

Message 実行された処理
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 _ サイズ タブの位置を再計算し、タブ コントロールの一部を無効にし、一部またはすべてのタブを強制的に再描画する場合があります。