Tips.36 C++Builder/Windowsプログラミング
ListView(vsReport)上でマウスのある位置の文字列を得る

ListViewでマウスが指しているアイテム(サブアイテムも考慮して)の文字列を取得します。

AnsiString __fastcall
TListView_GetTooltipStr( TListView* List, int& x, int& y)
{
    //マウスが指しているアイテムを探す
    //素直に GetItemAt(x, y) とするとサブアイテム上でNULLを返してしまう。
    TListItem* Item = List->GetItemAt(4, y);
    if ( Item == NULL )
    { //失敗
        return "";
    }
 
    //++++++ マウスの指しているカラムを取得する +++++++++++
    int width = 3;
    int i;
    for ( i = 0 ; i < List->Columns->Count ; i++)
    {
        if ( x < width + List->Columns->Items[i]->Width)
        {
            break;
        }
        width += List->Columns->Items[i]->Width;
    }
    //====================================================

    if ( i == List->Columns->Count )
    {  //範囲外
        return "";
    }

    //++++++ スクリーン座標へ変換する ++++++++++++++++++++
    //これは、Tips37で説明する隠れているアイテムをツールチップで
    //表示するために使用します。
    TPoint TipPos = Point(width, Item->Top);
    TipPos = List->ClientToScreen( TipPos );
    x = TipPos.x , y = TipPos.y;
    //====================================================
    AnsiString Ret = "";
    if ( i == 0)
    {
        //純粋に文字を返すなら
        // return Item->Caption; //のみでいい。
        if ( List->StringWidth( Item->Caption ) > List->Columns->Items[0]->Width)
        {
           return Item->Caption;
        }
        return "";
    }
    else
    {
        //純粋に文字を返すなら
        // return Item->SubItems->Strings[i-1]; //のみでいい。
        if ( List->StringWidth( Item->SubItems->Strings[i-1] ) 
                    > List->Columns->Items[i]->Width)
        {
           Ret = Item->SubItems->Strings[i-1];
        }
    }
    return Ret;
}
//------------------------------------------------------------------
戻る [参照] TListView