Laden...

openfiledialog über picturebox mit eventhandler

Erstellt von bloody_fighter vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.510 Views
B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 14 Jahren
openfiledialog über picturebox mit eventhandler

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

T
381 Beiträge seit 2009
vor 14 Jahren

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.

B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 14 Jahren

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 😦

49.485 Beiträge seit 2005
vor 14 Jahren

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

T
381 Beiträge seit 2009
vor 14 Jahren

Und wenn es ein fremder OpenFileDialog ist kannst du abfragen ob deine Form den Focus hat.

B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 14 Jahren

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?

49.485 Beiträge seit 2005
vor 14 Jahren

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

B
bloody_fighter Themenstarter:in
54 Beiträge seit 2008
vor 14 Jahren

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?

5.299 Beiträge seit 2008
vor 14 Jahren

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.