リスト ビューの作業領域を使用する方法

このトピックでは、リストビューの作業領域を操作する方法について説明します。 作業領域は、リストビュー コントロール内のアイテムを配置するために使用できる矩形の仮想領域です。 作業領域はウィンドウではなく、表示される境界線を持つことはできません。 既定では、リストビュー コントロールには作業領域がありません。 作業領域を作成することで、アイテムの左、上、または右に空の境界線を作成したり、通常は水平スクロール バーがないときに水平スクロール バーを表示したりできます。

知っておくべきこと

テクノロジ

前提条件

  • 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;
}

List-View コントロール リファレンス

リスト ビュー コントロールについて

List-View コントロールの使用