2016-07-12 30 views
0

Wie überprüfe ich, ob eine Maus auf ein Rechteck geklickt hat?Ich habe ein Rechteck erstellt, wie überprüfe ich, ob die Maus darauf geklickt hat?

Graphics gfx; 
Rectangle hitbox; 
hitbox = new hitbox(50,50,10,10); 
//TIMER AT THE BOTTOM 
gfx.Draw(System.Drawing.Pens.Black,hitbox); 
+0

Was ist Ihr 'gfx' beziehen sich auf? – Tommy

+0

Wenn Ihr "gfx" ein "e.Graphics ..." von einem Formular ist, dann verwenden Sie einfach das Ereignis MouseDown, es gibt e.X und e.Y. –

+0

Verwenden Sie niemals 'control.CreateGraphics'! Versuchen Sie niemals ein 'Graphics' Objekt zu cachen! Zeichnen Sie entweder mit einem 'Graphics g = Graphics.FromImage (bmp)' oder im 'Paint' -Ereignis eines Steuerelements in eine' Bitmap bmp'. Verwenden Sie dazu den 'e.Graphics' Parameter. – TaW

Antwort

2

Nur eine Probe schnell und schmutzig, wenn Ihre "GFX" a "e.Graphics ..." ist aus einer Form:

public partial class Form1 : Form 
    { 
    private readonly Rectangle hitbox = new Rectangle(50, 50, 10, 10); 
    private readonly Pen pen = new Pen(Brushes.Black); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawRectangle(pen, hitbox); 
    } 

    private void Form1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if ((e.X > hitbox.X) && (e.X < hitbox.X + hitbox.Width) && 
      (e.Y > hitbox.Y) && (e.Y < hitbox.Y + hitbox.Height)) 
     { 
     Text = "HIT"; 
     } 
     else 
     { 
     Text = "NO"; 
     } 
    } 
    } 
+1

thanks! Kumpel! Du hast viel geholfen – Kill4lyfe

0

Rectangle hat mehr praktisch, aber oft Funktionen übersehen. In diesem Fall mit der Rectangle.Contains(Point) Funktion ist die beste Lösung:

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (hitbox.Contains(e.Location)) .. // clicked inside 
} 

Um festzustellen, ob Sie auf dem Umrisse geklickt Sie auf eine Breite, um zu entscheiden, werden Sie wollen, da der Benutzer nicht ohne weiteres einen einzigen Hit kann Pixel.

Dazu können Sie entweder GraphicsPath.IsOutlineVisible(Point) ..

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    GraphicsPath gp = new GraphicsPath(); 
    gp.AddRectanle(hitbox); 
    using (Pen pen = new Pen(Color.Black, 2f)) 
     if (gp.IsOutlineVisible(e.location), pen) .. // clicked on outline 

} 

..oder auf Rechtecke bleiben ..:

private void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Rectangle inner = hitbox; 
    Rectangle outer = hitbox; 
    inner.Inflate(-1, -1); // a two pixel 
    outer.Inflate(1, 1); // ..outline 

    if (outer.Contains(e.Location) && !innerContains(e.Location)) .. // clicked on outline 
}