Scrollen bei gedrückter Rechter Maustaste

Radhad

Erfahrenes Mitglied
Hallo zusammen,

ich versuch schon seit Stunden in meinem Programm mittels gedrückter Rechter Maustaste zu scrollen. Allerdings funktioniert das nicht.

Ich habe zuerst bei MouseDown die Position gespeichert und RightMouseButtonDown = true gesetzt. Bei MouseMove, innerhalb von if( RightMouseButtonDown == true) hole ich die aktuelle MousePosition, ziehe von der Aktuellen Position die unter mouseDown gespeicherte Position ab und benutze das Ergebnis für die neue Position des Scrollbalkens.

Aber dann flimmert das Bild nur noch, bis ich loslasse... Hat wer ein Beispiel, wie es funktioniert?


Gruß Radhad
 
Hallo Radhad,
bei Mousedown den Offset zu speichern ist schon mal richtig allerdings ist die Booleanvariable überflüssig.

Code:
Point mouseOffset;
private void OnMouseDown(object sender......
{
  mouseOffset = new Point(-e.X, -e.Y);
}

private void OnMouseMove(object sender....
{
  if (e.Button == MouseButtons.Right)
  {
    Point mousePos = Control.MousePosition;
    mousePos.Offset(mouseOffset.X, mouseOffset.Y);
    Location = mousePos;
  }
}

Das MouseDown-Ereigniss speichert einfach die Position, so wie es bei Ihnen der Fall war.
Bei MouseMove wird geprüft ob die richtige Taste gedrückt wird, falls dies der Fall sein sollte verwendet dieser Code einfach die aktuelle Mausposition und die ursprüngliche Position um damit die neue Position zu berechnen.
Es sind vielleicht noch einige Kleinigkeiten wie z.B. eine Abfrage auf empty einzubringen.
mfg ikays.
 
Also bei mir tut sich dabei garnichts...

Liegt es vielleicht daran, dass ich die auf der Form ein Panel habe, und im Panel die PictureBox ist? Denn ohne Panel werden keine Scrollbars angezeigt.
 
Ikays hat wohl gedacht, Du möchtest was mit der Maus bewegen.

Um zu scrollen, musst Dir mit einer WindowsAPI Funktion aushelfen.
Kann Dir nicht sagen, ob in .NET 2.0 bereits daran gedacht wurde, das mit in das Framework zu integrieren. :confused:
Definition:
C#:
[DllImport( "user32.dll" )]
public static extern IntPtr SendMessage( IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam );

public const Int32 WM_VSCROLL = 0x0115;

public const Int32 SB_LINEUP = 0x0;
public const Int32 SB_LINEDOWN = 0x1;
public const Int32 SB_TOP = 0x6;
public const Int32 SB_BOTTOM = 0x7;
Verwendung:
C#:
SendMessage( myControl.Handle, WM_VSCROLL, SB_LINEDOWN, IntPtr.Zero );
Dein Flag passt schonmal. Jetzt muss Dir das Control.MouseWheel Event abonnieren und darin dann MouseEventArgs.Delta verwerten...

Alternativ bietet Dir ScrollableControl auch noch eine nette Methode mit der Du jedes Controls in den Sichtbereich scrollen kannst ScrollableControl.ScrollControlIntoView. (Panel leitet von ScrollableControl ab ;) )
 
Hey cool, jetzt kann ich Hoch & runter scrollen bei gedrückter Rechter Maustaste - sieht zwar bissl grausam aus, aber naja, besser als nichts :D

Aber horizontal geht damit nicht, oder? Denn WM_HSCROLL will er nicht nehmen :/
 
Es scrollt ja nicht nur, wenn die rechte Maustaste gedrückt ist. Wenn Du ein Bild auswählst, wird es auch noch sofort in den sichtbaren Bereich gescrollt. ;)

Radhad hat gesagt.:
Denn WM_HSCROLL will er nicht nehmen
hast es mit
C#:
public const Int32 WM_HSCROLL = 0x0114
versucht?
 
Nein, hab das auch bei Google nicht so gefunden. Klappt jetzt shon ganz gut :) Nur flimmert das Bild ganz schön - aber ich denke, dass kann man nicht so leicht beheben.
 
Was hast bei Google gefunden?
Und was flimmert genau? Erstreckt sich dein "PictureSelector" etwa über den ganzen Bildschirm? Verziehen sich die Grafiken beim scrollen?

:offtopic:
Letzteres kenn ich selber, und wüsste nicht, wie man das in den Griff bekommen könnte, außer ein BrowserControl dafür zu missbrauchen. Ist vielleicht wahnsinnig aufwendig, aber das performante Ergebnis ist es für mich alle mal wert. Du kannst die gleichen Events auch auf HTML-Elemente legen und alles so agieren lassen, als währe es eine Windows.Forms GUI. Dafür benötigst aber HTML CSS und MSHTML Kenntnisse. Component-Based Development with Visual C# :google:
Wenn Du einen anderen ähnlich performanten Weg weißt, nur raus damit. ;)
 
Zurück