Aktualisierung einer PictureBox über das Panel Scroll Event

Azatoth

Mitglied
Hallo zusammen,

Ausgangslage:
Ich zeichne ein Raster auf eine Picturebox, die innerhalb eines Panels mit aktiver Autoscroll Funktion liegt. Am Raster werden die Koordinaten als Strings eingezeichnet und sollen beim Scrollen immer mitbewegt werden damit man sieht wo man sich befindet. Meine Idee war jetzt die Positionen der Vertical und HorizontalScroll Eigenschaft als Offset zu nehmen und die Picturebox beim Aufruf des Scroll Events des Panels zu aktualisieren.

Problem:
Da das Scroll Event des Panels nicht für jeden Einzelschritt den man scrollt aufgerufen wird springt die Anzeige immer um ein paar Pixel anstatt sich flüssig mitzubewegen. Meine Frage lautet nun: Gibt es eine Möglichkeit das Scroll Event für jeden Einzelschritt aufzurufen oder hat man die Möglichkeit ein anderes Event zu benutzen?

Code:
private void splitContainer_Haupt_Panel2_Scroll(object sender, ScrollEventArgs e)
{
	Console.WriteLine(e.ScrollOrientation.ToString() +  " = " + e.OldValue.ToString() + " -> " + e.NewValue.ToString());
	pbBeschriftungsbereich.Refresh();
}

private void pbBeschriftungsbereich_Paint(object sender, PaintEventArgs e)
{
	Graphics GrafikHandle = e.Graphics;

	m_Beschriftungsbereich.BeschriftungsbereichZeichnen(GrafikHandle, splitContainer_Haupt.Panel2.HorizontalScroll.Value, splitContainer_Haupt.Panel2.VerticalScroll.Value);
}
 
Zuletzt bearbeitet:

Azatoth

Mitglied
Danke schonmal für die Antwort. Das würde heißen das ich ein HScrollbar und ein VScrollbar Element hinzufügen müsste und diese dann manuell behandele richtig? Heißt das, das ich mit der Autoscroll Eigenschaft des Panels keine Chance habe da da das ValueChanged Ereignis nicht existiert?
 

Shakie

Erfahrenes Mitglied
Ich hätte dein Problem testen sollen, bevor ich dir antworte.
Vergiss, was ich oben geschrieben habe. Es würde das Problem wahrscheinlich nicht lösen.
Bei mir tritt das Scroll-Ereignis des Panels bei jeder kleinsten Änderung an den Scrollleisten ein.
Ich kann dein Problem also nicht reproduzieren!
Bei mir wird das Scroll-Event für jeden Einzelschritt ausgelöst.
Bist du dir sicher, dass wirklich das Scroll-Ereignis nicht ausgelöst wird, oder wird nur das Paint-Ereignis nicht ausgelöst?
Es kann nämlich sein, dass die Form mitbekommt, dass irgendwas neu gezeichnet wird, diese Aufgabe aber "hintenanstellt" und erst dann ausführt, wenn genügend Rechenleistung frei ist.
Oder kann es sein, dass deine Paint-Methode sehr rechenintensiv ist und dein Programm somit ruckelt?
Probier mal statt der Refresh-Methode die Invalidate-Methode. Das sollte bewirken, dass das Paint-Event seltener ausgelöst wird.
Für den Unterschied zwischen Refresh und Invalidate siehe z.B. hier.
 
Zuletzt bearbeitet:

Azatoth

Mitglied
Ich werde mir die Invalidate-Methode mal ansehen. Deine Vermutung das das Paint Ereignis hinten angestellt wird hatte ich am Anfang auch, aber dann habe ich mir die OldValue und NewValue Werte (Codebeispiel oben) im Scroll Ereignis auf der Console ausgeben lassen. Wenn ich jetzt keinen Denkfehler drin habe sollten diese Werte maximal um 1 bzw. -1 abweichen oder? Ich dachte wenn die Differenz der Werte größer als 1 ist bedeutet das das Scroll Event nicht bei jedem Schritt aufgerufen wird. Testweise hatte ich auch das OnMouseMove Ereignis benutzt dort funktionierte alles tadellos jedoch ist es für meine Zwecke Unbrauchbar.
 

Azatoth

Mitglied
Ich habe es jetzt anders gelöst und zwar zeichne ich die Skala nun in einem eigenen Panel und nutze dort auch die Autoscroll Eigenschaft. Jetzt springt die Skala nicht mehr sondern wird flüssig gescrollt.