[C++Builder]リストビューのカーソルの位置にある項目を取得する

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

サンプルプログラム

listview1

マウスカーソルが移動したときに、カーソルの位置にある項目の行と列を表示する

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください