Also in meinem Programm ist eine Picturebox, welche darauf reagiert, wenn die Maus darin "gezogen" wird, mit diesen beiden Funktionen:
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
gedrücktX = Convert.ToInt16(e.X);
gedrücktY = Convert.ToInt16(e.Y);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
int dx = gedrücktX - e.X;
int dy = gedrücktY - e.Y;
verschieben(dx, dy);
}
Jetzt möchte ich eine Datei öffnen, dazu nehme ich einen Openfiledialog. Wenn ich in diesem Dialog jetzt eine Datei auswähle mit Doppelklick, dann wird die verschieben() funktion aufgerufen. Dies passiert aber nur, wenn die Datei, auf die ich klicke, "über" der Picturebox ist. WEnn ich die Datei mit Enter öffne tritt der Fehler auch nicht auf.
Wie kann ich das verhindern??
liebe Grüße
Das einfachste wäre eine boolsche Variable die angibt ob der OpenFileDialog offen ist. Dann noch ne kleine if in Verschieben() und es läuft.
Wieso allerdings das Click event durch einen OpenFileDialog hindurch funktioniert wundert mich auch etwas.
okay, jetzt stellt sich mir aber die Frage, wie ich heraus finde, ob der OpenFileDialog geöffnet ist...habe in den Eigenschaften leider nichts gefunden 😦
Hallo bloody_fighter,
er ist offen, sobald die ShowDialog-Methode aufgerufen wurde und solange sie noch nicht zurückgekehrt ist. Daraus ergibt sich direkt, wo du deine boolsche Variable setzen und zurücksetzen musst.
herbivore
okay,also ich glaube, die zweite Methode ist einfacher... Hierzu habe ich folgendes gefunden:
if (Focused)
{
}
So funktioniert es aber nicht, wenn ich diesen Code einfach in der Form1 verwende..aber weshalb nicht?
Hallo bloody_fighter,
aber weshalb nicht?
vermutlich weil das Form selbst nicht den Focus hat, sondern eins seiner Controls.
So funktioniert es aber nicht,
Siehe [Hinweis] Wie poste ich richtig? Punkt 5.
herbivore
naja, ich wusste ja nicht warum es nicht funktioniert, deshalb konnte ich das ganze auch nicht genauer posten...UNd wie finde ich heraus, ob irgend eines der Controls den Focus hat?
Ich denke, du mußt einfach im MouseUp deine gedrückt-Variablen auf einen Wert setzen, der anzeigt, dass die Maus nicht mehr gedrückt ist.
Wenn dann ein MouseUp kommt, zu dem das MouseDown nicht von dir ist, dann kannstedas ignorieren.
Nochwas:
Ich würde Sonderzeichen in codenamen vermeiden, schon von daher empfiehlt sich englisch zu coden.
Kommt immer wieder vor, dass ein 'ü' Probleme macht.
X und Y gibts auch als Einheit, nämlich als System.Drawing.Point.
Günstiger zum Draggen ist aber System.Drawing.Size (auch wenn das stattdessen mit .Width und .Height aufwartet), weil man Sizes fabelhaft voneinander subtrahieren kann, und auch von Points.
Also letztlich sowas:
private Size _DragAnchor=new Size(-1,-1);
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
_DragAnchor=new Size(e.Location);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if(_DragAnchor.Width<0)return;
Size dlt=_DragAnchor - new Size( e.Location)
verschieben(dlt);
_DragAnchor=new Size(-1,-1);
}
Der frühe Apfel fängt den Wurm.