Mesoscopic Programming

タコさんプログラミング専門

Programming Tips #7 スクロールバーのつまみの盲点

SB_THUMBTRACK と SB_THUMBPOSITION 通知の位置情報は誤り

スクロールバーのつまみがドラッグされるとイベントが発生しますが、そのとき wParam 引数の位置情報を信じるとえらい目にあいます。
1メガ級のバイナリファイルを表示してて、スクロールバーをドラッグしてみて気が付きました。
そうです、引数の位置情報は16ビットしかないので正確なスクロール位置を表現できないのです。
したがってつまみドラッグイベントの場合は、GetScrollInfo() 関数で高精度のつまみ位置情報を取得する必要があります。

LRESULT View :: OnVsbThumbPosition()
{
    SCROLLINFO scr;

    scr.cbSize = sizeof scr;
    scr.fMask  = SIF_TRACKPOS;

    GetScrollInfo( hwnd, SB_VERT, & scr );

    Scroll( SB_VERT, scr.nTrackPos );

    return 0;
}

以上。