ListView_SubItemHitTest関数を使用すると、指定した位置にある項目の行番号と列番号を取得できます。
LVHITTESTINFO構造体のPOINT型のptにカーソル位置の座標を設定します。
LVHITTESTINFO hitInfo;
hitInfo.pt.x = X;
hitInfo.pt.y = Y;
ListView_SubItemHitTest関数にLVHITTESTINFO構造体をわたすと、LVHITTESTINFO構造体のiItemに行番号が、iSubItemに列番号が設定されます。
ListView_SubItemHitTest関数はカーソル位置の座標が範囲外の時は-1を返します。
if (ListView_SubItemHitTest(ListView1->Handle, &hitInfo) == -1)
{
// -1なら範囲外
}
else
{
int row = hitInfo.iItem;
int col = hitInfo.iSubItem;
}
サンプルプログラム
マウスカーソルが移動したときに、カーソルの位置にある項目の行と列を表示する
void __fastcall TForm1::ListView1MouseMove(TObject *Sender, TShiftState Shift, int X,
int Y)
{
LVHITTESTINFO hitInfo;
hitInfo.pt.x = X;
hitInfo.pt.y = Y;
if (ListView_SubItemHitTest(ListView1->Handle, &hitInfo) == -1)
{
// -1なら範囲外
Caption = L"";
}
else
{
int row = hitInfo.iItem;
int col = hitInfo.iSubItem;
Caption = Format(L"行=%d 列=%d", ARRAYOFCONST((row, col)));
}
}
サンプルプログラム
リストビューをクリックしたときに、カーソルの位置にある項目の行と列を表示する
void __fastcall TForm1::ListView1Click(TObject *Sender)
{
LVHITTESTINFO hitInfo;
hitInfo.pt = ListView1->ScreenToClient(Mouse->CursorPos);
if (ListView_SubItemHitTest(ListView1->Handle, &hitInfo) == -1)
{
// -1なら範囲外
Caption = L"";
}
else
{
int row = hitInfo.iItem;
int col = hitInfo.iSubItem;
Caption = Format(L"行=%d 列=%d", ARRAYOFCONST((row, col)));
}
}