Laden...

Mauskoordinaten auslesen

Erstellt von Flite vor 18 Jahren Letzter Beitrag vor 18 Jahren 24.270 Views
F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren
Mauskoordinaten auslesen

Hallo!

Ich habe eine - hoffentlich ganz einfach zu beantwortende - Frage.

Ich will in einem Doppelklickereignis auf einer PictureBox die Mauskoordinaten des Klicks abfragen (nicht die globalen, sondern die relativen zum Klick). Wie bekomme ich die?

Viele Grüße & Danke
Flite

G
130 Beiträge seit 2005
vor 18 Jahren

Hey,

Control.MousePosition.X
Control.MousePosition.Y

greets george

F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

Hallo george,

rufe ich damit die Mauskoordinaten auf dem Picture ab? Woher weiß C#, dass mit Control das Picture gemeint ist?

Ich bin noch Anfänger in C#. Wäre nett, wenn du mir das kurz erklären könntest.

Viele Grüße
Flite

S
8.746 Beiträge seit 2005
vor 18 Jahren

Wenn ich mich recht entsinne sind die Korrdinaten immer relativ bezogen auf das Control. Wenn du also einen MouseDown-Event-Handler in der PictureBox registrierst, bekommst du 0/0 für die linke obere Ecke der Picturebox.

G
130 Beiträge seit 2005
vor 18 Jahren

Hey,

svenson hat Recht. Die Koordinaten sind relativ, also nicht die Pixelposition innerhalb der PictureBox. Die bekommst du aber relativ einfach über Umrechnung oder


private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
   e.X;
   e.Y;
}

F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

Hallo!

Das hoffte ich auch. Mit Control.Mousposition.X bekomme ich aber wohl die absolute Mausposition auf dem Bildschirm. In der linken oberen Ecke kriege ich Werte um 100px ... Außerdem ändert sich der Wert auch, wenn ich die Maus im Einzelschrittmodus bewege.

In Visual Basic gab es im Klickereignis die Parameter X und Y. Genau das meine ich eigentlich. Diese ändern sich auch nicht mehr, sondern geben die Position an, wo der Klick erfolgt ist.

Oder muss ich evtl. die osition der PictureBox und des Formulars mit einbeziehen?

Viele Grüße
Flite

F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

@george: Mein Event hat aber folgende Parameter:
private void pictureBox1_DoubleClick(object sender, System.EventArgs e)

Einfach ändern kann ich den zweiten Parameter ja nicht, dann bringt der Compiler ne Fehlermeldung (eigentlich auch klar). Wie erreicht man, dass hier die Mausposition übergeben wird?

Viele Grüße
Flite

G
130 Beiträge seit 2005
vor 18 Jahren

Hey,

du wirst nicht an die Umrechnung vorbeikommen. Schaue dir mal in der MSDN RectangleToScreen() an.

Für eine Übergabe der Mausposition müßtest du das Event OnDoubleClick(...) überschreiben und einen eigenen Eventdelegaten(ich glaube so heißt das) mit deinen Parametern erstellen.
Ich denke aber, dass die Umrechnung der Werte viel einfacher und schneller zu handlen ist.

greets george

S
8.746 Beiträge seit 2005
vor 18 Jahren

Im Click-Ereignis werden keine Maus-Koordinaten übertragen. Dazu musst du das MouseDown oder MouseUp Ereignis verwenden. Dort kommen anstelle der "normalen" EventArgs "echte" MouseEventArgs daher. Daher hast du dann auch X/Y (realtiv wie gewünscht), sowie Informationen welcher Mausknopf gedrückt wurde und ob dabei auch z.B. die Shift-Taste gehalten wurde.

F
Flite Themenstarter:in
22 Beiträge seit 2005
vor 18 Jahren

Hallo zusammen

ich habe jetzt die Mausposition genommen und hievorn Left der Form, Rand der Form und Left der Picturebox abgezogen.

Jetzt geht es soweit.

Dank euch!

Viele Grüße
Flite

S
8.746 Beiträge seit 2005
vor 18 Jahren

Offenbar hast du mein Posting nicht richtig gelesen:

Du kannst das genauso machen, wie du es von VB gewohnt bist: Verwende den MouseDown-Event und hole dir aus dem MouseEventArgs-Parameter die Position X und Y. Diese Position sind bereits bezogen auf das Control und NICHT auf das Fenster.

Eine Umrechnung ist also nicht nötig. Du musst nichts abziehen oder so.

Wichtig ist nur, dass du den MouseDown-Handler nicht auf dem Fenster sondern auf der PictureBox registrierst. Positionen sind immer bezogen auf den Event-Anbieter. Hängst du dich beim Fenster ein, bekommst du Fenster-Koordinaten, machst du das bei der PictureBox bekommst du PictureBox-Koordinaten.

G
130 Beiträge seit 2005
vor 18 Jahren

Hey

@svenson:
ich denke, er will aber explizit das DoubleClick-Event nutzen.

Mein Event hat aber folgende Parameter:
private void pictureBox1_DoubleClick(object sender, System.EventArgs e)

Hatte ja auch schon das MouseDown-Event vorgeschlagen.

greets george

S
8.746 Beiträge seit 2005
vor 18 Jahren

Ah, sorry, da hab _ich _wohl nicht aufmerksam genug gelesen... 🙂

Hat MS in .NET 2.0 eigentlich allen Mouse-Events jetzt die MouseEventArgs spendiert? Ich finds extrem lästig, dass das in den Click-Events fehlt.

830 Beiträge seit 2005
vor 18 Jahren

Hallo,

Original von Flite
Das hoffte ich auch. Mit Control.Mousposition.X bekomme ich aber wohl die absolute Mausposition auf dem Bildschirm. In der linken oberen Ecke kriege ich Werte um 100px ...

Stimmt. Mit Control.MousePosition bekommst du die Position relativ zum Bildschirm. Jedes Control, also auch eine PictureBox, hat eine Methode PointToClient(Point). Also bekommst du mit

yourePictureBox.PointToClient(Control.MousePosition);

die Position der Maus auf deiner PictureBox.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

1.271 Beiträge seit 2005
vor 18 Jahren

Original von svenson
Hat MS in .NET 2.0 eigentlich allen Mouse-Events jetzt die MouseEventArgs spendiert? Ich finds extrem lästig, dass das in den Click-Events fehlt.

Jein. Das Click- und das DoubleClick-Ereignis haben immer noch nur ein EventArgs. Dafür wurden aber die MouseClick- und MouseDoubleClick-Ereignisse mit MouseEventArgs eingeführt. Ich bin zufrieden damit 😉

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Macht ja aus Kompatibiltätsgründen Sinn. Fein.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Flite,

ich habe jetzt die Mausposition genommen und hievorn Left der Form, Rand der Form und Left der Picturebox abgezogen.

das ist keine gute Lösung. Alternativen wurde ja schon beschrieben. Wenn du wirklich umrechnen willst, dann nimm lieber Control.PointToClient als das von Hand zu machen.

herbivore