2016-05-19 2 views
2

Je suis en train de créer un programme graphique et je suis coincé là où j'ai besoin d'obtenir les coordonnées de la souris pour obtenir une échelle graphique égale. Avec picturebox j'utilise une transformation à l'échelle de mon graphique:Transformer les coordonnées de la souris

RectangleF world = new RectangleF(wxmin, wymin, wwid, whgt); 
     PointF[] device_points = 
      { 
       new PointF(0, PictureBox1.ClientSize.Height), 
       new PointF(PictureBox1.ClientSize.Width, PictureBox1.ClientSize.Height), 
       new PointF(0, 0), 
      }; 
     Matrix transform = new Matrix(world, device_points); 
     gr.Transform = transform; 

enter image description here Im en utilisant la fonction MouseMove. Y a-t-il un moyen de transformer les coordonnées de la souris? Quand je mets ma souris sur x = 9 Je dois ma souris de coordonnées à 9.

private void PictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine(e.X); 
    } 
+2

Ne perdez pas la trace de * transform *. Vous aimerez sa méthode Invert(), pratique pour mapper les coordonnées de la souris en coordonnées graphiques. –

Répondre

2

Comme Hans commentaire l'indique, vous pouvez utiliser une seconde Matrix pour y parvenir. Vous pouvez l'obtenir en copiant l'original Matrix et en appelant la méthode Invert() de la copie, ou vous pouvez créer le nouveau Matrix à partir de zéro en inversant les rectangles d'entrée de l'original.

Inverser à mon humble avis est plus facile, mais cela signifie que vous aurez besoin de créer la matrice inverse et de le stocker quelque part. .: par exemple

Matrix transform = new Matrix(world, device_points); 
    gr.Transform = transform; 
    inverseTransform = transform.Clone(); 
    inverseTransform.Invert(); 

inverseTransform est un champ dans votre classe plutôt que d'une variable locale, afin que votre code de gestion des souris peut l'utiliser plus tard.

Si vous devez construire le Matrix plus tard, vous pourriez le faire comme ceci:

RectangleF device = new RectangleF(new Point(), PictureBox1.ClientSize); 
PointF[] world_points = 
    { 
     new PointF(wxmin, wymin + whgt), 
     new PointF(wxmin + wwid, wymin + whgt), 
     new PointF(wxmin, wymin), 
    }; 
Matrix inverseTransform = new Matrix(device, world_points); 

Dans les deux cas, vous simplement utiliser la méthode Matrix.TransformPoints() dans votre code de gestion des souris pour appliquer la transformation inverse de la souris coordonne pour revenir aux coordonnées de votre monde.

+0

Je l'ai fait mais il retourne les mêmes valeurs X et Y. 'inverseTransform = transform.Clone(); inverseTransform.Invert(); Liste location = new Liste (); Point p = nouveau Point (e.X, e.Y); location.Add (p); reverseTransform.TransformPoints (location.ToArray()); Console.WriteLine ("location =" + location [0]); ' – WhizBoy

+2

Basé sur votre commentaire ici: Les valeurs de point sont transformées sur place. Vous avez créé un nouveau tableau à transmettre à la méthode 'TransformPoints()', mais vous le passez directement à la méthode au lieu de conserver une référence. Ainsi, la méthode transforme les points, mais vous n'avez aucun moyen d'obtenir les nouvelles valeurs. Essayez 'Point [] location = {nouveau Point (e.X, e.Y)}; reverseTransform.TransformPoints (emplacement); '. –