Share via


リスト コントロールの作業領域の実装

既定では、リスト コントロールはすべての項目を標準のグリッド形式で整列します。 ただし、作業領域という別の方法がサポートされています。作業領域では、リスト項目が四角形のグループに配置されます。 作業領域を実装するリスト コントロールのイメージについては、Windows SDK の「List-View コントロールの使用」を参照してください。

Note

作業領域は、リスト コントロールがアイコンまたは小さいアイコン モードの場合にのみ表示されます。 ただし、ビューをレポート モードまたはリスト モードに切り替えた場合、現在の作業領域は維持されます。

作業領域を使用すると、項目の左側、上部、または右側に空枠を表示したり、通常は表示されない水平スクロール バーが表示されるようにしたりできます。 もう 1 つの一般的な使用方法は、項目を移動またはドロップできる複数の作業領域を作成することです。 この方法では、1 つのビューに異なる意味を持つ複数の領域を作成できます。 そのようにすると、ユーザーは、別の領域に項目を配置することで、項目を分類できます。 この例として、読み取りと書き込みのファイル用の領域と、読み取り専用のファイル用の別の領域があるファイル システムのビューを挙げることができます。 ファイル項目が読み取り専用の領域に移動された場合、その項目は自動的に読み取り専用になります。 読み取り専用の領域から読み取りと書き込みの領域にファイルを移動すると、ファイルは読み取りと書き込みが可能になります。

CListCtrl には、リスト コントロール内の作業領域を作成および管理するためのいくつかのメンバー関数が用意されています。 GetWorkAreas および SetWorkAreas は、リスト コントロールに現在実装されている作業領域が格納されている CRect オブジェクト (または RECT 構造体) の配列を取得して設定します。 さらに、GetNumberOfWorkAreas は、リスト コントロールの現在の作業領域の数 (既定ではゼロ) を取得します。

項目と作業領域

作業領域が作成されると、作業領域内にある項目が、その領域のメンバーになります。 同様に、作業領域に移動された項目は、移動先の作業領域のメンバーになります。 どの作業領域内にもない項目は、自動的に最初の (インデックス 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);

1 つの領域内のすべての項目を表示するために必要な合計領域の見積もりを取得するために、ApproximateViewRect の呼び出しが行われました。 その後、この見積もりは 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);

関連項目

CListCtrl の使い方
コントロール