ヘッダー コントロールについて
ヘッダー コントロールは、通常はテキストまたは数値の列の上に配置されるウィンドウです。 列ごとにタイトルが含まれており、コントロールを複数のパーツに分割することができます。 ユーザーは、パーツを区切っている分割バーをドラッグすることで、個々の列の幅を設定できます。 次の図は、ディレクトリ内のファイルに関する詳細情報を提供する、ラベル付きの列を持つヘッダー コントロールを示しています。
ヘッダー コントロールを作成するには、CreateWindowEx 関数を使用し、WC_HEADER ウィンドウ クラスと適切なヘッダー コントロール スタイルを指定します。 このウィンドウ クラスは、共通コントロール DLL が読み込まれるときに登録されます。 この DLL が確実に読み込まれるようにするには、InitCommonControlsEx 関数を使用します。 ヘッダー コントロールを作成した後で、ヘッダー ウィンドウ メッセージを使用することで、コントロールを複数のパーツに分割し、パーツごとにテキストを設定して、ウィンドウの外観を制御することができます。
ヘッダー コントロールは、リスト ボックスなどの別のコントロールの子ウィンドウとして作成できます。 ただし、親コントロールはヘッダー コントロールを認識しないため、ヘッダーのために領域を割くことは許容されません。その結果、リスト項目がヘッダーの背後に表示されます。 リスト ボックスまたは他のコントロールでヘッダー コントロールを使用する場合は、すべての項目が正しい位置に表示されるように、親コントロールを所有者描画にする必要があります。
リスト ビュー コントロールでは、ヘッダー コントロールが既に存在します。 リスト ビュー コントロール用にヘッダー コントロールを作成する代わりに、LVM_GETHEADER または ListView_GetHeader を使用して、既存のコントロールを取得します。
ヘッダー コントロールのサイズと位置
通常は、ウィンドウのクライアント領域など、特定の四角形の境界内に収まるようにヘッダー コントロールのサイズと位置を設定する必要があります。 HDM_LAYOUT メッセージを使用することで、ヘッダー コントロールから適切なサイズと位置の値を取得できます。
HDM_LAYOUT を送信するときに、ヘッダー コントロールが占有する長方形の座標を格納し、、WINDOWPOS 構造体へのポインターを提供する HDLAYOUT 構造体のアドレスを指定します。 このコントロールは、指定された四角形の上部に沿ってコントロールを配置するための適切なサイズと位置の値を、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 メッセージを使用します。
所有者描画ヘッダー コントロール
ヘッダー コントロールの個々の項目を、所有者描画項目として定義できます。 この手法を使用すると、ヘッダー項目の外観を制御するよりも詳細に制御できます。
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_ENDFILTEREDIT、HDN_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 ウィンドウ クラスのウィンドウ プロシージャで処理されるウィンドウ メッセージについて説明しています。
メッセージ | 実行される処理 |
---|---|
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 | 新しいフォント ハンドルを選択してヘッダー コントロールのデバイス コンテキストに設定します。 |