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;
    

Anmelden zum Antworten