リスト コントロールの作業領域の実装
既定では、リスト コントロールは、標準的なグリッドですべての項目を整列します。 ただし、"作業領域" という方法もサポートされています。作業領域では、リスト項目が四角形のグループに整列されます。 作業領域を実装するリスト コントロールのイメージについては、Windows SDK の「Using List-View Controls」を参照してください。
注意
作業領域は、リスト コントロールが大きいアイコン モード、または小さいアイコン モードの場合にのみ表示されます。 ただし、ビューがレポート モードまたはリスト モードに切り替えられても、現在の作業領域は保持されます。
作業領域では、項目の左辺、上辺、および右辺に空の境界線を表示できます。また、通常は表示できないような場所に水平スクロール バーを表示できます。 ほかの一般的な使用法には、項目を移動したり、ドロップしたりできる複数の作業領域の作成があります。 この方法では、単一のビューに異なる意味を持つ作業領域を作成できます。 ユーザーは、項目を異なる領域に配置することにより、項目を分類できます。 この例として、読み取り/書き込みファイルの領域と読み取り専用ファイルの領域を持つファイル システムのビューを挙げることができます。 読み取り専用領域に移動されたファイル項目は、自動的に読み取り専用になります。 読み取り専用領域から読み取り/書き込み領域に移動したファイルは、読み取り/書き込みになります。
CListCtrl には、リスト コントロールで作業領域を作成および管理するための関数がいくつか用意されています。 GetWorkAreas および SetWorkAreas は、リスト コントロールに現在実装されている作業領域を格納する CRect オブジェクト (または RECT 構造体) の配列を取得および設定します。 さらに、GetNumberOfWorkAreas は、リスト コントロールの作業領域の現在の数 (既定では 0) を取得します。
項目と作業領域
作業領域を作成すると、作業領域内にある項目は作業領域のメンバーになります。 同様に、作業領域に移動した項目も、移動先の作業領域のメンバーになります。 どの作業領域にも属さない項目は、最初の作業領域 (インデックス 0) のメンバーになります。 項目を作成して特定の作業領域に配置するには、項目を作成し、SetItemPosition を呼び出して、目的の作業領域に移動します。 この方法を次の 2 番目の例に示します。
次の例では、リスト コントロール (m_WorkAreaListCtrl) に 4 つの作業領域 (rcWorkAreas) を実装します。各作業領域は同じサイズで、周囲に 10 ピクセル幅の境界線を描きます。
CSize size;
size = m_WorkAreaListCtrl.ApproximateViewRect();
size.cx += 100;
size.cy += 100;
CRect rcWorkAreas[4];
rcWorkAreas[0].SetRect(0, 0, (size.cx/2) - 5, (size.cy/2) - 5);
rcWorkAreas[1].SetRect((size.cx/2) + 5, 0, size.cx, (size.cy/2) - 5);
rcWorkAreas[2].SetRect(0, (size.cy/2) + 5, (size.cx/2) - 5, size.cy);
rcWorkAreas[3].SetRect((size.cx/2) + 5, (size.cy/2) + 5, size.cx, size.cy);
//set work areas
m_WorkAreaListCtrl.SetWorkAreas(4, rcWorkAreas);
上の例では、ApproximateViewRect を呼び出して、1 つの領域にすべての項目を表示する場合のおおよその領域の総計を取得しています。 次に、この見積もり値を 4 つの領域に分割し、5 ピクセル幅の境界線を描画しています。
次の例では、既存のリスト項目を各グループ (rcWorkAreas) に割り当て、処理を確定するためにコントロール ビュー (m_WorkAreaListCtrl) を更新します。
// set insertion points for each work area
CPoint rgptWork[4];
for (int i = 0; i < 4; i++)
{
rgptWork[i].x = rcWorkAreas[i].left + 10;
rgptWork[i].y = rcWorkAreas[i].top + 10;
}
// now move all the items to the different quadrants
for (int i = 0; i < 20; i++)
{
m_WorkAreaListCtrl.SetItemPosition(i, rgptWork[i % 4]);
}
// force the control to rearrange the shuffled items
m_WorkAreaListCtrl.Arrange(LVA_DEFAULT);