次の方法で共有


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

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

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

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

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

アイテムと作業領域

作業領域が作成されると、作業領域内にある項目がその作業領域のメンバーになります。 同様に、作業領域に移動された項目は、移動先の作業領域のメンバーになります。 作業領域内にない項目は、自動的に最初の (インデックス 0) 作業領域のメンバーになります。 アイテムを作成し、特定の作業領域内に配置する場合は、そのアイテムを作成し、 SetItemPosition を呼び出して目的の作業領域に移動する必要があります。 次の 2 番目の例は、この手法を示しています。

次の例では、リスト コントロール (rcWorkAreas) に、各作業領域の周囲に 10 ピクセル幅の境界線を持つ等しいサイズの 4 つの作業領域 (m_WorkAreaListCtrl) を実装します。

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);

こちらも参照ください

CListCtrl の使用
コントロール