V
irgendwie so:
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
// do we need scroll panes?
{
RECT ServerRect;
RECT ClientRect;
GetClientRect(GetDesktopWindow(), &ServerRect);
GetClientRect(hwnd, &ClientRect);
// do we need a vertical scroll pane?
if(ServerRect.bottom > ClientRect.bottom)
{
//SetScrollPos(hwnd, SB_VERT, 3, TRUE);
SCROLLINFO si;
si.cbSize = sizeof(si);
si.nMin = 0;
si.nMax = ServerRect.bottom;
si.nPage = ClientRect.bottom;
si.fMask = SIF_RANGE | SIF_PAGE;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
}
// do we need a horizontal scroll pane?
if(ServerRect.bottom > ClientRect.bottom)
{
//SetScrollPos(hwnd, SB_VERT, 3, TRUE);
SCROLLINFO si;
si.cbSize = sizeof(si);
si.nMin = 0;
si.nMax = ServerRect.right;
si.nPage = ClientRect.right;
si.fMask = SIF_RANGE | SIF_PAGE;
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
}
}
return 0;
case WM_VSCROLL:
{
// vertikal Bildlaufleiste abfragen
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL; // Alle Felder besetzen
GetScrollInfo(hwnd, SB_VERT, &si);
// Position für späteren Vergleich festhalten
int iVertPos = si.nPos;
switch(LOWORD(wParam))
{
case SB_TOP:
si.nPos = si.nMin;
break;
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEUP:
si.nPos -=1;
break;
case SB_LINEDOWN:
si.nPos +=1;
case SB_PAGEUP:
si.nPos -= si.nPage;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
// Position erst setzen und dann wieder abfragen. Weil Windows über die Seitengröße
// umrechnet, kommt bei der Abfrage überlicherweise ein anderer Wert heraus
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
GetScrollInfo(hwnd, SB_VERT, &si);
// Wenn sich die Position geändert hat: Fensterinhalt rollen und aktualisieren
if(si.nPos != iVertPos)
{
//ScrollWindow(hwnd, 0, 30, NULL, NULL);
//UpdateWindow(hwnd);
InvalidateRect(hwnd, NULL, TRUE);
}
}
return 0;
case WM_HSCROLL:
{
// vertikal Bildlaufleiste abfragen
SCROLLINFO si;
si.cbSize = sizeof(si);
si.fMask = SIF_ALL; // Alle Felder besetzen
GetScrollInfo(hwnd, SB_HORZ, &si);
// Position für späteren Vergleich festhalten
int iHorzPos = si.nPos;
switch(LOWORD(wParam))
{
case SB_TOP:
si.nPos = si.nMin;
break;
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEUP:
si.nPos -=1;
break;
case SB_LINEDOWN:
si.nPos +=1;
case SB_PAGEUP:
si.nPos -= si.nPage;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
// Position erst setzen und dann wieder abfragen. Weil Windows über die Seitengröße
// umrechnet, kommt bei der Abfrage überlicherweise ein anderer Wert heraus
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
GetScrollInfo(hwnd, SB_HORZ, &si);
// Wenn sich die Position geändert hat: Fensterinhalt rollen und aktualisieren
if(si.nPos != iHorzPos)
{
//ScrollWindow(hwnd, 0, 30, NULL, NULL);
//UpdateWindow(hwnd);
InvalidateRect(hwnd, NULL, TRUE);
}
}
return 0;