abgehackter Text beim scrollen



  • Hallo zusammen.
    Ich hab leider absolut keine Ahnung wonach ich per Sucfunktion suchen könnte um halbwegs schnell eine Antwort auf mein Problem zu finden deshalb dieser Thread.

    Ich habe mit der Anwendungsprogrammierung unter Windows angefangen und habe nun ein Fenster erstellt.
    Dieses soll einen 2 Spaltigen Text ausgeben und diesen 50 Zeilen lang wiederholen (nur zur Übung).
    Ich habe über SetScrollinfo und GetScrollinfo die ganze Scrollbar geschichte eingefügt.
    Ich kann Scrollen, der Scrollbar bewegt sich und sonst ist auch alles okay bis auf diese gravierende (wahrscheinlich) kleinigkeit:
    Wenn ich Scrolle egal ob horizontal oder vertikal, wird der Text der bisher unsichtbar war (durch die Grenzen des Fensters) falsch dargestellt.
    Wenn ich vertikal scrolle, fehlt der gröte Teil der jeweiligen Zeile und nur die oberen ca 20% der Zeile(n) werden dargestellt.
    Wenn ich horizontal scrolle, wird je nachdem wie lange ich den scrollbalken gedrückt ziehe mehr oder weniger vom Wort abgehackt. Wenn ich auf ´den rechtspreil klicke dann wird das nun sichtbare wort in kleine Stücke gehäckselt (bei mehrmaligem drücken, mehrere kleine Stücke)

    Hoffe die Fehlerbeschreibung war ausführlich genug.

    Wäre super wenn mir einer helfen könnte. Wenn ihr vielleicht bestimmte codesegmente braucht für eine Diagnose, dann schreibt mir welche und ich poste sie.
    Danke erstmal 🙂



  • öhm, ich bin beim besten willen kein fachmann, aber ich denke, dass es helfen würde, wenn du mal WM_PAINT und WM_VSCROLL/WM_HSCROLL posten würdest.



  • So hier mal der gesamte relevante Code.
    Ich denke ich hab vielleicht irgendeinen denkfehler oder sogar irgendwie falsch gerechnet beim anzeigen der zeilen nach dem scrollen.
    Hab folgendes noch rausgefunden:
    wenn ich iMaxZeilen nicht auf 50 sondern nur auf 20 setze, werden sie korrekt angezeigt. Auch wenn ich das fenster so klein mache, dass ich wieder scrollen muss. Wenn ich jetzt aber 200 eingebe, dann werden die Zeilen im ersen Screen wie immer richtig angezeigt, sobald ich aber scrolle wieder abgehackt. Jedoch alle paar Zeilen mal wieder voll.....
    Was hab ich da nur geproggt ???

    case WM_CREATE:
    		hdc=GetDC (hwnd);
    
    		GetTextMetrics (hdc,&tm);
    		cxChar = tm.tmAveCharWidth;
    		cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar/2;
    		cyChar = tm.tmHeight + tm.tmExternalLeading;
    
    		ReleaseDC (hwnd, hdc);
    
    		// Gesamtbreite (x) der Anwendung festlegen
    		iMaxWidth = (sizeof Text1*cxChar+5)+(sizeof Text2*cxChar);
    		return 0;
    
    	case WM_SIZE:
    		// Ermittlung des Anwendungsbereichs in x und y
    		cxClient = LOWORD (lParam);
    		cyClient = HIWORD (lParam);
    
    		// Bereich und Seitengröße des vertikalen Scrollbars
    		si.cbSize	= sizeof (si);
    		si.fMask	= SIF_RANGE|SIF_PAGE;
    		si.nMin		= 0;
    		si.nMax		= iMaxZeilen-1;
    		si.nPage	= cyClient / cyChar;
    		SetScrollInfo (hwnd,SB_VERT,&si, TRUE);
    
    		// Bereich und Seitengröße des horizontalen Scrollbars
    		si.cbSize	= sizeof (si);
    		si.fMask	= SIF_RANGE|SIF_PAGE;
    		si.nMin		= 0;
    		si.nMax		= 2 + iMaxWidth / cxChar;
    		si.nPage	= cxClient / cxChar;
    		SetScrollInfo (hwnd,SB_HORZ,&si, TRUE);
    
    		return 0;
    
    	case WM_VSCROLL:
    
    		// vertikale Scrollbar abfragen
    		si.cbSize	= sizeof (si);
    		si.fMask	= SIF_ALL;
    		GetScrollInfo (hwnd,SB_VERT, &si);
    
    		// aktuelle Position festhalten für späteren vergleich mit neuer Position
    		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;
    			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;
    
    		default:
    			break;
    		}
    
    	// neue Position setzen und dann abfragen
    		si.fMask = SIF_POS;
    		SetScrollInfo (hwnd,SB_VERT,&si,TRUE);
    		GetScrollInfo (hwnd,SB_VERT,&si);
    
    	// Wenn sich die Position geändert hat, Bildschirm scrollen und Inhalt aktualisieren
    		if (si.nPos != iVertPos)
    		{
    			ScrollWindow (hwnd,0, cyChar*(iVertPos-si.nPos),NULL,NULL);
    			UpdateWindow (hwnd);
    		}
    
    		return 0;
    
    		case WM_HSCROLL:
    			// horizontale Scrollbar abfragen
    			si.cbSize	= sizeof (si);
    			si.fMask	= SIF_ALL;
    
    			// Aktuelle Posi für späteren Vergleich mit neuer Posi festhalten
    			GetScrollInfo (hwnd, SB_HORZ,&si);
    			iHorzPos = si.nPos;
    
    			switch (LOWORD (wParam))
    			{
    			case SB_LINELEFT:
    				si.nPos -= 1;
    				break;
    
    			case SB_LINERIGHT:
    				si.nPos +=1;
    				break;
    
    			case SB_PAGELEFT:
    				si.nPos -= si.nPage;
    				break;
    
    			case SB_PAGERIGHT:
    				si.nPos += si.nPage;
    
    			case SB_THUMBPOSITION:
    				si.nPos = si.nTrackPos;
    				break;
    
    			default:
    				break;
    			}
    
    			// Neue Posi setzen und dann abfragen
    			si.fMask = SIF_POS;
    			SetScrollInfo (hwnd, SB_HORZ, &si, TRUE);
    			GetScrollInfo (hwnd, SB_HORZ,&si);
    
    			// Wenn sich die Posi geändert hat Bildschirm horizontal scrollen
    			if (si.nPos != iHorzPos)
    			{
    				ScrollWindow (hwnd, cxChar * (iHorzPos - si.nPos), 0, NULL, NULL);
    				UpdateWindow (hwnd);
    			}
    
    			return 0;
    
    	case WM_PAINT:
    		hdc = BeginPaint (hwnd, &ps);
    
    		// Positionsabfrage des vertikalen Scrollbars
    		si.cbSize	= sizeof (si);
    		si.fMask	= SIF_POS;
    
    		GetScrollInfo (hwnd, SB_VERT, &si);
    		iVertPos = si.nPos;
    
    		// Positionsabfrage des horizontalen Scrollbars
    		GetScrollInfo (hwnd, SB_HORZ, &si);
    		iHorzPos = si.nPos;
    
    		// Welche Zeilen müssen tatsächlich ausgegeben werden ?
    		iPaintBeg = max (0, iVertPos + ps.rcPaint.top/ cyChar);
    		iPaintEnd = min (iMaxZeilen -1, iVertPos + ps.rcPaint.bottom / cyChar);
    
    		for (i = iPaintBeg; i<iPaintEnd; i++)
    		{
    			x = cxChar * (1 - iHorzPos);
    			y = cyChar * (i - iVertPos);
    
    			TextOut (hdc, x, y, Text1, lstrlen (Text1));
    
    			TextOut (hdc, sizeof(Text1)*cxChar+5, y,Text2, lstrlen (Text2));
    		}
    
    		EndPaint(hwnd,&ps);
    		return 0;
    


  • Habe das vertikale scrollen jetzt hinbekommen indem ich diese Zeile:

    iPaintEnd = min (iMaxZeilen -1, iVertPos + ps.rcPaint.bottom / cyChar);
    

    in diese abänderte:

    iPaintEnd = min (iMaxZeilen -1, (iVertPos + ps.rcPaint.bottom / cyChar)+1);
    

    Ich hab nun aber leider keine Ahnung warum das so sein muss (habs einfach mal probiert).
    Ausserdem weiss ich noch immer nicht wie ich es beim horizontalen hinbekommen soll.



  • Black-Panther schrieb:

    Ich hab nun aber leider keine Ahnung warum das so sein muss (habs einfach mal probiert).

    Ich könnte mir vorstellen, dass es daran liegt, dass ps.rcPaint.bottom / cyChar als int interpretiert und daher immer abgerundet bzw. die Nachkomma-Stellen abgeschnitten werden 🙄

    Black-Panther schrieb:

    Ausserdem weiss ich noch immer nicht wie ich es beim horizontalen hinbekommen soll.

    Wie genau sieht das beim horizontalen Scrollen denn aus?


Anmelden zum Antworten