• ベストアンサー

リストビュー:先頭行のアイテム番号取得

リストビューコントロールで、 最上位に表示されているアイテムの番号を取得したく、 以下のような関数を作ったのですがうまくいきません。 リストビューの0番目のアイテムが先頭行に表示されていると、正しい値が取得できるのですが、 それ以外だと、取得すべき値より1小さい値が返されてしまいます。 どこがまずいか、または別の方法があれば、 ご教授ください。 [関数] int GetTopItemNum(HWND hDlg){ HWND hList = GetDlgItem(hDlg, IDC_INFOTABLE); RECT r; LVHITTESTINFO lvhti; ListView_GetItemRect (hList, 0, &r,LVIR_BOUNDS) // カーソルサイズ取得 lvhti.pt.x = (r.right-r.left)/2; lvhti.pt.y = (r.bottom-r.top)/2; // 中心取得 lvhti.flags = LVHT_ONITEMLABEL; ListView_HitTest (hList, &lvhti);// 表示先頭行でヒットテスト return lvhti.iItem; // 先頭行のアイテム番号取得 }

質問者が選んだベストアンサー

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

ListView_GetTopIndex を使って取得するのは如何でしょうか? リストビューがlistモード又はreportモードの時であれば、 一番上の可視項目の番号が取得できるようです。

J_H
質問者

お礼

ListView_GetTopIndex でうまくいきました ありがとうございます

その他の回答 (1)

  • fruipa
  • ベストアンサー率38% (14/36)
回答No.1

リストビューはしょっちゅう使っています。ただご質問の関数は経験が無いので推測ですが。 > ListView_GetItemRect (hList, 0, &r,LVIR_BOUNDS) // カーソルサイズ取得 これは0番目のアイテムに外接する四角形を取得しますので、毎回0番目のアイテムの位置を基準にヒットテストを行っていることになります。 ListView_GetOriginという関数が現在表示されているビューの原点(0,0でしょうか?)を返すので、ここから右と下に少しずらしたポイントでヒットテストを行えば現在表示されている最初のアイテムが取得できるのではないかと思います。 想像ですいません。

J_H
質問者

お礼

NO2 のかたのほうほうでうまくいきました。 ありがとうございました

関連するQ&A

専門家に質問してみよう