#リストコントロールのスクロール
リストコントロールで表示されるスクロールバーは中々曲者であり、いつまで経っても思い通りになってくれない。
MSDNの嘘翻訳じゃ意味が全く分からないので、実験した。
MFC的解法を探したので記述する。
##解:Scroll関数
CListCtrlのScroll()は、相対位置指定である。現在のスクロールバーのつまみの位置から上下にどれだけ移動するかピクセル単位で指定する。
しかし、移動量はRowの高さの倍数でなければならない。端数は考慮されない。
よって、行高さを求め、現在位置を特定し、目的行までの相対行数を求め、相対座標に変換してScrollする。
リストコントロールの基準位置は表示されている最上部の行なので、特定行を中央に表示したい場合などはオフセットするべし。
なお、0行から始まっているので注意。
//CListCtrl m_list;
CRect rc;
m_list.GetItemRect(0, &rc, LVIR_BOUNDS);//行高さ
int index = m_list.GetTopIndex();//現在行
int offset = rc.Height() * (10 - index);//10行へオフセット計算
CSize cs;
cs.cx = 0;
cs.cy = offset;
if (offset) {
m_list.Scroll(cs);
}
##駄目だった例
###GetScrollInfo,SetScrollInfo
GetScrollInfoはそれほど悪くない。SetScrollInfoも動作はするが、スクロールバーだけが移動して、リストコントロールの中身は何も移動しない。
スクロールバーを制御してもメッセージが飛ばないのだろう。