Scrolling im Panel unterbinden

Wayan

Mitglied
Hallo Tutorianer :)

Ich bin da grade auf ein Problem gestoßen, zu dem mir keine Lösung einfällt.

Ich habe in einer Form ein Panel und in diesem wiederum eine Picturebox.

Das Panel steht auf Autoscroll (die picbox kann größer als das Panel werden)
und die Picturebox besitzt ein Event auf auf mouseDown, mit welchem das Panel mittels Mousedrag gescrollt wird.

Nun habe ich eine zusätzliches mouseWheel Event angelegt welches die Picturebox zoomt...

Funktioniert prächtig, bis auf die unangenehme eigenschaft des Panels, das es ebenfalls automatisch per Mausrad gescrollt werden kann, soll heißten: jedes Mal wenn ich zoome und die Picturebox größer als das Panels wird reagiert die vertikale Scrollleiste des Panels ebenfalls auf das Mausrad.

Dies soll aber nicht so sein.

Habe gerade versucht dem Panel ebenfalls ein mouseWheel Event zuzuweisen und einfach gar nichts zu machen... funktioniert leider auch nicht.

Hat jemand von euch eine Idee?

Vielen Dank im Voraus

Wayan
 

Shakie

Erfahrenes Mitglied
Ich habe hier was gefunden. Anscheinend musst du die ScrollToControl-Methode des Panels überschreiben (siehe diese Antwort):
C#:
class PanelNoScrollOnFocus : Panel
{
    protected override System.Drawing.Point ScrollToControl(Control activeControl)
    {
        return DisplayRectangle.Location;
    }
}
 

Wayan

Mitglied
Danke Shakie - die Lösung funktioniert fast - allerdings muß man das OnMouseWheel event überschreiben, dann scrollt das Panel nicht mehr bei Mausradbenutzung.
Das was du gefunden hast setzt die Scrollposition nur zurück wenn das Panel den Focus verliert und wiederbekommt.

Soll heißen: Wenn es schön sein soll ohne alleine rumzuscrollen sollte man beides machen :)

In diesem Sinne
Danke und einen schönen Tag
Wayan
 
Zuletzt bearbeitet:

Tim Bureck

Erfahrenes Mitglied
Ich hab das ganze Problem quasi umgekehrt. Folgende Situation: Ich habe ein eigenes Usercontrol mit einem Tabcontrol. In dem Tab habe ich ein FlowLayoutPanel gelegt, in diesem wiederum ein "NFZDrawPanel", letztlich eine Malfläche. Nun wollte ich es so haben, dass ich diese Malfläche beim Drehen des Mausrades und gleichzeitigem Drücken der Strg-Taste zoomen kann. Gesagt getan, funktioniert. Was jetzt aber nicht mehr funktioniert ist das Scrollen des Panels.

Auszug aus dem Usercontrol:
C#:
...
protected override void OnMouseWheel(MouseEventArgs me) {
  if (Control.ModifierKeys == Keys.Control) {
    base.OnMouseWheel(me);

    if (me.Delta > 0) {
      this.drawPanelSideLeft.ZoomLevel *= 2;
    } else {
      this.drawPanelSideLeft.ZoomLevel /= 2;
    }
  }
}

Wie kann ich OnMouseWheel jetzt wieder beibringen das Panel zu scrollen? (Ich dachte eigentlich das wäre dann unabhängig voneinander...)
 

Wayan

Mitglied
Ich hätte jetzt gesagt einfach die base Methode aufrufen, aber ich sehe grade das du das ja schon machst... (eigentlich sollte das Panel nun scrollen UND zoomen, oder?

Ansonsten würde ich einfach versuchen für den Fall das strg nicht gedrückt ist "base" aufzurufen...

Nur als Idee, weiß aber grade nicht obs geht.
 

Tim Bureck

Erfahrenes Mitglied
Habe es nun so gelöst, dass ich das Scrollen quasi neu schreibe:

C#:
if (Control.ModifierKeys == Keys.Control) {
  ...
} else {
  if (me.Delta) > 0) {
    if (panelSideLeft.VerticalScroll.Value - 30 < panelSideLeft.VerticalScroll.Minimum) {
      panelSideLeft.VerticalScroll.Value = 0;
    } else {
      panelSideLeft.VerticalScroll.Value -= 30;
    }
  } else {
    if (panelSideLeft.VerticalScroll.Value + 30 > panelSideLeft.VerticalScroll.Maximum) {
      panelSideLeft.VerticalScroll.Value = panelSideLeft.VerticalScroll.Maximum;
    } else {
      panelSideLeft.VerticalScroll.Value += 30;
    }
  }
}
...