タブ コントロールについて

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

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

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では、ツールボックスを使用してタブ コントロールを作成できます。

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

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

特定の特性をタブ コントロールに適用するには、コントロールの作成時にタブ コントロール のスタイルを指定します。 たとえば、タブ コントロールのタブの配置と一般的な外観を指定できます。

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

TCS_FOCUSONBUTTONDOWN スタイルを指定すると、クリックしたときにタブが入力フォーカスを受け取る可能性があります。 このスタイルは通常、 TCS_BUTTONS スタイルでのみ使用されます。 TCS_FOCUSNEVER スタイルを使用して、クリックしたときにタブが入力フォーカスを受け取らないことを指定できます。

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

タブ コントロールは、アイコン (存在する場合) とそのラベルに合わせて各タブのサイズを自動的に変更します。 すべてのタブの幅を同じにするには、 TCS_FIXEDWIDTH スタイルを指定します。 コントロールは、最も幅の広いラベルに合わせてすべてのタブのサイズを設定するか、 TCM_SETITEMSIZE メッセージを使用して特定の幅と高さを割り当てることができます。 各タブ内で、コントロールはアイコンとラベルを中央に配置し、ラベルの左側にアイコンを配置します。 TCS_FORCEICONLEFT スタイルを指定することで、ラベルを中央に配置したまま、アイコンを左に強制的 に配置 できます。 TCS_FORCELABELLEFT スタイルを使用して、アイコンとラベルの両方を左揃えにできます。 TCS_RIGHTJUSTIFY スタイルで TCS_FIXEDWIDTHスタイルを 使用することはできません。

親ウィンドウで、 TCS_OWNERDRAWFIXED スタイルを使用してコントロール内のタブを描画することを指定できます。 詳細については、「 所有者描画タブ」を参照してください。

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

タブとタブ属性

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

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

TCM_GETITEMCOUNT メッセージを使用して現在のタブ数を取得し、TCM_DELETEITEM メッセージを使用してタブを削除し、TCM_DELETEALLITEMS メッセージを使用してタブ コントロール内のすべてのタブを削除できます。

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

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

構造体の最初のメンバーは TCITEMHEADER 構造体である必要があり、残りのメンバーはアプリケーション定義データを指定する必要があります。 TCITEMHEADERTCITEM と同じですが、 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 メッセージを使用してタブ コントロールに割り当てることができます。

他の画像リストと同様に、タブ コントロールのイメージ リストに画像を追加できます。 ただし、アプリケーションでは、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 パラメーターは、DRAWITEMSTRUCT 構造体のアドレスを指定します。この構造体には、タブのインデックス、その外接する四角形、および描画するデバイス コンテキスト (DC) が含まれます。

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

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

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

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

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

複数のタブ コントロールで同じツールヒント コントロールを使用するには、ツールヒント コントロールを自分で作成し、 TCM_SETTOOLTIPS メッセージを使用してタブ コントロールに割り当てます。 TCM_GETTOOLTIPS メッセージを使用して、タブ コントロールの現在のツールヒント コントロールへのハンドルを取得できます。 独自のツールヒント コントロールを作成する場合は、 TCS_TOOLTIPS スタイルを使用しないでください。

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

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

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_SIZE タブの位置を再計算し、タブ コントロールの一部を無効にして、一部またはすべてのタブの再描画を強制する場合があります。