ヘッダー コントロールについて

ヘッダー コントロールは、通常、テキストまたは数値の列の上に配置されるウィンドウです。 各列のタイトルが含まれており、パーツに分割できます。 ユーザーは、各列の幅を設定するために、パーツを分離する区切り線をドラッグできます。 次の図は、ディレクトリ内のファイルに関する詳細情報を提供する列にラベルが付いたヘッダー コントロールを示しています。

screen shot of a dialog box with a three-column header control

ヘッダー コントロールを作成するには、 CreateWindowEx 関数を使用して、 WC_HEADER ウィンドウ クラスと適切な ヘッダー コントロール スタイルを指定します。 このウィンドウ クラスは、共通コントロール DLL が読み込まれるときに登録されます。 この DLL が確実に読み込まれるようにするには、 InitCommonControlsEx 関数を 使用します。 ヘッダー コントロールを作成したら、ヘッダー ウィンドウ メッセージを使用して、そのコントロールをパーツに分割し、各パーツのテキストを設定し、ウィンドウの外観を制御できます。

ヘッダー コントロールは、リスト ボックスなどの別のコントロールの子ウィンドウとして作成できます。 ただし、親コントロールはヘッダー コントロールを認識せず、ヘッダーによって占有される領域を許可しません。その結果、リスト 項目はヘッダーの背後に表示されます。 リスト ボックスまたは他のコントロールでヘッダー コントロールを使用する場合は、すべての項目が正しい位置に表示されるように、親コントロールを所有者が描画する必要があります。

リスト ビュー コントロールには既にヘッダー コントロールがあります。 リスト ビュー コントロールのヘッダー コントロールを作成する代わりに、 LVM_GETHEADER または ListView_GetHeader を使用して既存のコントロールを取得します。

ヘッダー コントロールのサイズと位置

通常は、ウィンドウのクライアント領域など、特定の四角形の境界内に収まるようにヘッダー コントロールのサイズと位置を設定する必要があります。 HDM_LAYOUT メッセージを使用すると、ヘッダー コントロールから適切なサイズと位置の値を取得できます。

HDM_LAYOUT送信するときは、ヘッダー コントロールが占有する四角形の座標を含む HDLAYOUT 構造体のアドレスを指定し、WINDOWPOS 構造体へのポインターを提供します。 コントロールは、指定した四角形の上部にコントロールを配置するために適したサイズと位置の値を WINDOWPOS 構造体に入力します。 高さの値は、コントロールの水平境界線の高さと、コントロールのデバイス コンテキストで現在選択されているフォントの文字の平均高さの合計です。

HDM_LAYOUTを使用してヘッダー コントロールの初期サイズと位置を設定する場合は、非表示になるようにコントロールの初期表示状態を設定します。 サイズと位置の値を取得する HDM_LAYOUT を送信した後、 SetWindowPos 関数を使用して、新しいサイズ、位置、および可視性の状態を設定できます。

アイテム

通常、ヘッダー コントロールには、コントロールの列を定義するヘッダー項目がいくつかあります。 ヘッダー コントロールに項目を追加するには、 HDM_INSERTITEM メッセージをコントロールに送信します。 メッセージには 、HDITEM 構造体のアドレスが含まれています。 この構造体は、文字列、ビットマップイメージ、初期サイズ、およびアプリケーション定義 の LPARAM 値を含むことができるヘッダー項目のプロパティを定義します。

アイテムの HDITEM 構造体の fmt メンバーには、HDF_STRINGフラグまたはHDF_BITMAP フラグを含めることができます。このフラグは、コントロールに項目の文字列またはビットマップを表示するかどうかを示します。 文字列とビットマップの両方を表示する場合は、HDF_OWNERDRAW フラグを含むように fmt メンバーを設定して、所有者描画項目を作成します。 また、HDITEM 構造体は、項目の四角形内の文字列またはビットマップを中央揃え、左揃え、または右揃えにするかどうかをコントロールに指示する書式設定フラグも指定します。

HDM_INSERTITEMは 、新しく追加された項目のインデックスを返します。 他のメッセージのインデックスを使用して、プロパティを設定したり、アイテムに関する情報を取得したりできます。 削除するアイテムのインデックスを指定して、 HDM_DELETEITEM メッセージを使用してアイテムを削除できます。

HDM_SETITEM メッセージを使用して、既存のヘッダー項目のプロパティとHDM_GETITEM メッセージを設定して、アイテムの現在のプロパティを取得できます。 ヘッダー コントロール内の項目の数を取得するには、 HDM_GETITEMCOUNT メッセージを使用します。

Owner-Drawn ヘッダー コントロール

ヘッダー コントロールの個々の項目を所有者描画アイテムとして定義できます。 この手法を使用すると、ヘッダー項目の外観よりも多くの制御が得られます。

HDM_INSERTITEM メッセージを使用して、新しい所有者描画項目をヘッダー コントロールまたはHDM_SETITEM メッセージに挿入して、既存のアイテムを所有者描画アイテムに変更できます。 どちらのメッセージにも HDITEM 構造体のアドレスが含まれており、 fmt メンバーが HDF_OWNERDRAW 値に設定されている必要があります。

ヘッダー コントロールは、所有者描画アイテムを描画する必要がある場合、 WM_DRAWITEM メッセージを親ウィンドウに送信します。 メッセージの wParam パラメーターはヘッダー コントロールの子ウィンドウ識別子であり、 lParam パラメーターは DRAWITEMSTRUCT 構造体のアドレスです。 親ウィンドウでは、構造体の情報を使用して項目を描画します。 ヘッダー コントロール内の所有者描画項目の場合、 DRAWITEMSTRUCT 構造体には次の情報が含まれます。

メンバー 説明
CtlType 所有者 描画コントロールの種類ODT_HEADERします。
CtlID ヘッダー コントロールの子ウィンドウ識別子。
Itemid 描画する項目のインデックス。
itemAction 描画アクション フラグをODA_DRAWENTIREします。
ItemState カーソルが 項目上にあり、マウス ボタンがダウンしている場合は、描画アクション フラグをODS_SELECTEDします。 それ以外の場合、このメンバーは 0 です。
hwndItem ヘッダー コントロールへのハンドル。
hDC ヘッダー コントロールのデバイス コンテキストへのハンドル。
rcItem 描画するヘッダー項目の座標。 座標は、ヘッダー コントロールの左上隅を基準にしています。
Itemdata 項目に関連付けられているアプリケーション定義の 32 ビット値。

 

ヘッダー コントロール フィルター

ヘッダー コントロールの HDS_FILTERBAR ウィンドウ スタイルを指定することで、列見出しの下にフィルター編集ボックスを配置できます。 編集ボックスの横にフィルター ボタンが表示されます。 HDN_BEGINFILTEREDIT、 HDN_ENDFILTEREDITHDN_FILTERBTNCLICK、またはHDN_FILTERCHANGE通知コードに応答 することで、フィルター処理 実装できます。

既定では、ユーザーがテキストを入力するように求めるプロンプトが編集ボックスに表示されます。 編集ボックスは、Header_ClearFilterまたはHeader_ClearAllFiltersを使用して、この既定状態に戻すことができます。

次のコード例は、リスト ビュー コントロールからヘッダー コントロールを取得し、フィルター バーを追加する方法を示しています。

// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);

既定のヘッダー 制御メッセージ処理

このセクションでは、 WC_HEADER ウィンドウ クラスのウィンドウ プロシージャによって処理されるウィンドウ メッセージについて説明します。

Message 実行される処理
WM_CREATE ヘッダー コントロールを初期化します。
WM_DESTROY ヘッダー コントロールを初期化解除します。
WM_ERASEBKGND コントロールの現在の背景色を使用して、ヘッダー コントロールの背景を塗りつぶします。
WM_GETDLGCODE DLGC_WANTTAB値とDLGC_WANTARROWS値の組み合わせを返します。
WM_GETFONT 現在のフォントへのハンドルを返します。このハンドルは、ヘッダー コントロールがテキストを描画するために使用します。
WM_LBUTTONDBLCLK マウス入力をキャプチャします。 マウス カーソルが区切り線上にある場合、コントロールは HDN_BEGINTRACK 通知コードを送信し、区切り線のドラッグを開始します。 カーソルが項目上にある場合、項目は押された状態で表示されます。
WM_LBUTTONDOWN WM_LBUTTONDBLCLK メッセージと同じです。
WM_LBUTTONUP マウス キャプチャを解放します。 コントロールがマウスの動きを追跡していた場合は、 HDN_ENDTRACK 通知コードを送信し、ヘッダー コントロールを再描画します。 それ以外の場合、コントロールは HDN_ITEMCLICK 通知コードを送信し、クリックされたヘッダー項目を再描画します。
WM_MOUSEMOVE 区切り線がドラッグされている場合、コントロールは HDN_TRACK 通知コードを送信し、新しい位置に項目を表示します。 マウスの左ボタンが下にあり、カーソルが項目上にある場合、項目は押された状態で表示されます。
WM_NCCREATE 内部データ構造を割り当てて初期化します。
WM_NCDESTROY ヘッダー コントロールが初期化されていない後に、ヘッダー コントロールによって割り当てられたリソースを解放します。
WM_PAINT ヘッダー コントロールの無効な領域を描画します。 wParam パラメーターが NULL 以外の場合、コントロールは値が HDC であると見なし、そのデバイス コンテキストを使用して描画します。
WM_SETCURSOR カーソルが区切り線上にあるか、ヘッダー項目にあるかに応じて、カーソルの図形を設定します。
WM_SETFONT ヘッダー コントロールのデバイス コンテキストに新しいフォント ハンドルを選択します。