今回は、リストビューをグループ化します。次に、グループ化したリストビューを示します。これらの間はグループ化することができます。この区切りによりアイテムの種類が明確になります。アイテムをグループ化するには、ListView_InsertGroupでグループを作成します。pgrp);hwndは、リストビューのハンドルを指定します。indexは、グループが追加されるアイテムのインデックスを指定します。-1を指定した場合は、リストの最後に追加されます。pgrpは、LVGROUP構造体を指定します。LVGROUP構造体は、次のように定義されています。*PLVGROUP;cbSizeは、この構造体のサイズを指定します。maskは、初期化するメンバを表す定数を指定します。pszHeaderは、ヘッダ名を表す文字列を指定します。cchHeaderは、pszHeaderのサイズを指定します。ヘッダ名を取得しない場合は無視して問題ありません。pszFooterは、フッタ名を表す文字列を指定します。cchFooterは、pszFooterのサイズを指定します。フッタ名を取得しない場合は無視して問題ありません。iGroupIdは、グループのIDを指定します。stateMaskは、グループの状態を表す定数を指定します。グループを作成する場合は無視して問題ありません。stateは、グループの状態を表す定数を指定します。グループを作成する場合は無視して問題ありません。uAlignは、ヘッダ名を描画する位置を表す定数を指定します。Vistaから使用可能です。アイテムがグループ化されていることを示す区切りを表示するには、ListView_EnableGroupViewを呼び出します。fEnable);hwndは、リストビューのハンドルを指定します。fEnable、グループの区切りを表示する場合にTRUEを指定します。アイテムをグループ化したことにより、特定のグループのアイテムを表示したり非表示にしたりすることが可能になります。したグループの状態を変更する場合は、ListView_SetGroupStateを呼び出します。dwState);hwndは、リストビューのハンドルを指定します。dwGroupIdは、設定対象とするグループのIDを指定します。dwMaskは、設定対象の状態を表す定数を指定します。dwStateは、dwMaskの状態をどのように設定するかを表す定数を指定します。ヘッダ名など、グループの情報を変更したい場合はListView_SetGroupInfoを呼び出します。pgrp);hwndは、リストビューのハンドルを指定します。iGroupIdは、設定対象とするグループのIDを指定します。pgrpは、LVGROUP構造体のアドレスを指定します。今回のプログラムは、リストビューのアイテムをグループ化します。プロジェクトにマニフェストファイルを追加する必要があります。lParam);}ListView_InsertGroupを呼び出すには、LVGROUP構造体を初期化する必要があります。pszHeader、iGroupId、pszTaskを初期化することになります。これはListView_InsertItemに指定するLVITEM構造体にも指定することになります。具体的には、maskにLVIF_GROUPIDを指定し、iGroupIdに作成済みのグループのIDを指定します。これにより、このアイテムは指定したIDのグループに属することになります。ListView_SetItemの呼び出しが上手くいかなかったためです。グループのヘッダの右端にリンクが表示されるようになります。このリンクをクリックした場合はWM_NOTIFYでLVN_LINKCLICKが送られることになります。ここでどのような事をするかは自由ですが、今回はグループのアイテムの表示/非表示を切り替えるようにしています。アイテムを表示するためにListView_SetGroupStateの第4引数に0を指定します。次のリンクのクリックがアイテムの非表示と解釈されるように、pszTaskにHideを指定します。else文の方は、if文とは逆にアイテムを非表示にし、pszTaskにTRUEを指定します。ListView_SetGroupInfoの呼び出しによって、リンクの名前が変更されることになります。