リスト ビューの作業領域を使用する方法
このトピックでは、リストビューの作業領域を操作する方法について説明します。 作業領域は、リストビュー コントロール内のアイテムを配置するために使用できる矩形の仮想領域です。 作業領域はウィンドウではなく、表示される境界線を持つことはできません。 既定では、リストビュー コントロールには作業領域がありません。 作業領域を作成することで、アイテムの左、上、または右に空の境界線を作成したり、通常は水平スクロール バーがないときに水平スクロール バーを表示したりできます。
知っておくべきこと
テクノロジ
前提条件
- C/C++
- Windows ユーザー インターフェイス プログラミング
手順
作業領域を作成する
次の C++ コード例は、25 ピクセルの空の境界線を上、左、右側に配置して作業領域を作成する方法を示しています。
void SetWorkAreas1(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
GetClientRect(hWndListView, &rcClient);
rcClient.left += EMPTY_SPACE;
rcClient.top += EMPTY_SPACE;
rcClient.right -= (EMPTY_SPACE * 2);
SendMessage(hWndListView, LVM_SETWORKAREAS, 1, (LPARAM)&rcClient);
return;
}
複数の作業領域を作成する
次の C++ コード例は、コントロールに 2 つの作業領域を作成する方法を示しています。 各作業領域はクライアント領域の約半分を使用し、25 ピクセルの空の境界線で囲まれています。
void SetWorkAreas2(HWND hWndListView)
{
#define EMPTY_SPACE 25
RECT rcClient;
RECT rcWork[2];
GetClientRect(hWndListView, &rcClient);
rcWork[0].left = rcClient.left + EMPTY_SPACE;
rcWork[0].top = rcClient.top + EMPTY_SPACE;
rcWork[0].right = (rcClient.right/2) - EMPTY_SPACE;
rcWork[0].bottom = rcClient.bottom;
rcWork[1].left = (rcClient.right/2) + EMPTY_SPACE;
rcWork[1].top = rcClient.top + EMPTY_SPACE;
rcWork[1].right = rcClient.right - EMPTY_SPACE;
rcWork[1].bottom = rcClient.bottom;
SendMessage(hWndListView, LVM_SETWORKAREAS, 2, (LPARAM)rcWork);
return;
}
アイテムが属する作業領域を決定する
アイテムが属する作業領域を特定する 1 つの方法は、次の操作を行うことです。
- リストビュー コントロール内のすべての作業領域の座標のリストを取得します。
- アイテムの座標を取得します。
- アイテムの座標が作業領域の 1 つの座標内にあるかどうかを判断します。
次の C++ コード例のアプリケーション定義関数は、アイテムが属する作業領域のインデックスを返します。 関数が失敗すると、–1が返されます。 関数が成功したが、アイテムが作業領域の内部にない場合、作業領域内にないすべてのアイテムが自動的に作業領域 0 のメンバーになるため、関数は 0 を返します。
int GetItemWorkingArea(HWND hWndListView, int iItem)
{
UINT uWorkAreas = 0;
int nReturn = -1;
LPRECT pRects;
POINT pt;
if(!ListView_GetItemPosition(hWndListView, iItem, &pt))
return nReturn;
ListView_GetNumberOfWorkAreas(hWndListView, &uWorkAreas);
if(uWorkAreas)
{
pRects = (LPRECT)GlobalAlloc(GPTR, sizeof(RECT) * uWorkAreas);
if(pRects)
{
UINT i;
nReturn = 0;
ListView_GetWorkAreas(hWndListView, uWorkAreas, pRects);
for(i = 0; i < uWorkAreas; i++)
{
if(PtInRect((pRects + i), pt))
{
nReturn = i;
break;
}
}
GlobalFree((HGLOBAL)pRects);
}
}
return nReturn;
}
関連トピック