SCROLLINFO構造体

typedef struct tagSCROLLINFO {
UINT cbSize; //構造体のサイズ
UINT fMask; //設定・変更用フラグ
int nMin; //スクロールする最小値
int nMax; //スクロールする最大値
UINT nPage; //ページサイズ
int nPos; //スクロールバーのつまみの現在の位置
int nTrackPos; //現在のトラッキング位置だが、SetScrollInfo()は無視する
} SCROLLINFO;

UINT fMask
定数解説
SIF_ALL SIF_PAGE , SIF_POS
SIF_RANGE , と SIF_TRACKPOS の組み合わせ
SIF_DISABLENOSCROLL この値はスクロールバーの値をセットする時に限り使われる
もし、無効なパラメータが指定されても消去せずに使用不能にします
SetScrollInfo() 専用
SIF_PAGE nPage を設定することを明示します
SIF_POS nPos を設定することを明示します
SIF_RANGE nMin と nMax を設定することを明示します
SIF_TRACKPOS nTrackPos フィールドにつまみの位置をセットすることを明示
GetScrollInfo() 専用

RECT rectClient; // クライアントエリアのRECT構造体
SIZE sizeBitmap; // ビットマップのサイズ、SIZE構造体
SCROLLINFO si;
とし、縦スクロールバーとすると、

si.nMin = 0; // 厳密には si.nMin= rectClient.top;
si.nMax = sizeBitmap.cy - 1; // 高さ100ピクセルとすると、0から99まで
si.nPage = rectClient.bottom; // てな感じだが、お好きなように設定可能

if (si.nPos < 0) si.nPos = 0;
if (si.nPos > sizeBitmap.cy - rectClient.bottom) {
    si.nPos = sizeBitmap.cy - rectClient.bottom;
}

とまあ、こんなものかな?