LRESULT CALLBACK ScrollWindow(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_CREATE:
{
RECT rect;
GetClientRect(hWnd,&rect);
SCROLLINFO si;
si.cbSize = sizeof(si);
si.nMin = 0;
si.nMax = xx - 1; // Anzahl Buttons minus 1
si.nPage = rect.bottom / xx; // ButtonHöhe inkl Abstand zum Nächsten
si.fMask = SIF_PAGE|SIF_RANGE;
SetScrollInfo(hWnd,SB_VERT,&si,1);
return 0;
}
break;
case WM_SIZE:
{
RECT rect;
GetClientRect(hWnd,&rect);
SCROLLINFO si;
si.cbSize = sizeof(si);
si.nMin = 0;
si.nMax = xx - 1; // Anzahl Buttons minus 1
si.nPage = rect.bottom / xx; // ButtonHöhe inkl Abstand zum Nächsten
si.fMask = SIF_PAGE | SIF_RANGE;
SetScrollInfo(hWnd, SB_VERT, &si, 1);
InvalidateRect(hWnd,0,0);
return 0;
}
break;
case WM_VSCROLL:
{
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(hWnd,SB_VERT,&si);
si.fMask = SIF_POS;
switch(LOWORD(wParam))
{
case SB_LINEUP:
{
si.nPos -= 1;
}
break;
case SB_LINEDOWN:
{
si.nPos +=1;
}
break;
case SB_PAGEUP:
{
si.nPos -= si.nPage;
}
break;
case SB_PAGEDOWN:
{
si.nPos += si.nPage;
}
break;
case SB_THUMBTRACK:
{
si.nPos = si.nTrackPos;
}
break;
}
SetScrollInfo(hWnd, SB_VERT, &si, 1);
InvalidateRect(hWnd,0,0);
return 0;
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP BMP_current = CreateCompatibleBitmap(hdc,FensterBreite,Fensterhöhe); // volle Grösse mit allen Buttons
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem,BMP_current);
// hier das GANZE Fenster zeichnen, mit BitBlt(hdcMem ...)
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(hWnd,SB_VERT,&si);
BitBlt(hdc,0,0,rect.right,rect.bottom,hdcMem,0,si.nPos * xx,SRCCOPY); // ButtonHöhe inkl Abstand zum Nächsten
SelectObject(hdcMem,hbmOld);
DeleteDC(hdcMem);
DeleteObject(BMP_current);
EndPaint(hWnd,&ps);
return 0;
}
break;