リストビューで選択した項目を中央に表示する

言語:C, Win32API
リストビューで詳細表示を使っているときの選択項目のスクロールの仕方のメモ


最も簡単は方法は以下の通りだが

  1. ListView_SetItemState でアイテムを選択状態にする
  2. ListView_EnsureVisible でアイテムを表示領域に移動


これだと選択アイテムは見える位置にスクロールされるが、表示領域の一番下とか、一番上とか、とりあえず見えてればいい的な位置に表示されるので、それをなんとかしたい。
そこで以下のようにして、選択アイテムをリストビューの縦中央に見える位置にさらに自力でスクロールする。

  1. リストビューのクライアント領域をGetClientRectで取得する
  2. ListView_GetCountPerPage を使って、現在のリストビューの縦幅に対し、いくつの項目が表示可能かを調べる(n項目とする)
  3. クライアント領域の高さ height を n で割って、1項目あたりの高さ( h )を取得
  4. ListView_HitTest を使って、クライアント領域の中央部にある項目のIDを調べる
  5. ListView_Scroll で (選択した項目のID - 中央部の項目のID) * h 分スクロールしてやると、だいたい選択項目が縦中央に表示される感じになる


もっと簡単な方法がありそうだけどとりあえずこれでできたのでメモ。
一応ぐぐって情報を集めたんだけど、これだというのがなくて、結局自分で試行錯誤してこうなった。
MFCとか.NETとかならもっと楽な方法がありそうだけどね。