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

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

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

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_FIXEDWIDTH スタイルと TCS_RIGHTJUSTIFY スタイルは併用できません。

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

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

タブおよびタブ属性

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

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

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

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

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

構造体の最初のメンバーは TCITEMHEADER 構造体である必要があり、残りのメンバーはアプリケーション定義データを指定する必要があります。 TCITEMHEADER は、lParam メンバーがない点以外 TCITEM と同じです。 構造体のサイズと 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 メッセージを使用するとタブの現在の行数を決定できます。

所有者描画タブ

タブ コントロールに 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 スタイルを使用しないでください。

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

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

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