|
|
#define MAX_VSCROLL 100
#define PAGE_VSCROLL 20
| |
|
|
|
|
DWORD style;
style = WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL;
hWnd = CreateWindow(szWindowClass, szTitle, style,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
| |
|
|
|
|
case WM_VSCROLL:
// スクロール情報を初期化
ZeroMemory(&si, sizeof( SCROLLINFO ));
si.cbSize = sizeof( SCROLLINFO );
// パラメータに「位置情報」を取り込む
// ように指示
si.fMask = SIF_POS;
// 縦方向の位置情報を読み出す
GetScrollInfo( hWnd, SB_VERT, &si );
// つまりこの時点では現在の情報を
// 読み出したのみで何にも変更されていない
switch( LOWORD(wParam) ) {
case SB_LINEDOWN: // 1 行下へスクロール。
si.nPos++;
if ( si.nPos > MAX_VSCROLL ) {
si.nPos = MAX_VSCROLL;
}
break;
case SB_LINEUP: // 1 行上へスクロール。
si.nPos--;
if ( si.nPos < 0 ) {
si.nPos = 0;
}
break;
case SB_PAGEDOWN: // 1 ページ下へスクロール。
si.nPos += PAGE_VSCROLL;
if ( si.nPos > MAX_VSCROLL ) {
si.nPos = MAX_VSCROLL;
}
break;
case SB_PAGEUP: // 1 ページ上へスクロール。
si.nPos -= PAGE_VSCROLL;
if ( si.nPos < 0 ) {
si.nPos = 0;
}
break;
case SB_THUMBTRACK: // スクロール ボックスを指定位置へドラッグ。
si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_TRACKPOS;
GetScrollInfo( hWnd, SB_VERT, &si );
si.nPos = si.nTrackPos;
break;
default:
return 0;
}
// ここまでで、si.nPos が変更されている
// その変更された情報をスクロール側に登録して
// スクロールの状態を変更させる
si.cbSize = sizeof( SCROLLINFO );
si.fMask = SIF_POS;
SetScrollInfo( hWnd, SB_VERT, &si, true );
UpdateWindow( hWnd );
RedrawWindow( hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE );
break;
| |
|
|
|