Dialog Autoscroll
-
Gibt es bei Dialogen eine Funktion wie Autoscroll (falls der Platz für den Inhalt nicht ausreicht, das eine Scrollbar angezeigt wird)?
Wenn nicht, wie kann man sowas manuell erstellen?
Danke im voraus
-
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;