2016-07-12 4 views
0

Как проверить, щелкнула ли мышь прямоугольник?Я сделал прямоугольник, как проверить, нажата ли на нем мышь?

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

Что ваш 'gfx' см? – Tommy

+0

Если ваш «gfx» является «e.Graphics ...» из формы, то просто используйте событие MouseDown, есть e.X и e.Y. –

+0

Никогда не используйте 'control.CreateGraphics'! Никогда не пытайтесь кэшировать объект «Graphics»! Либо рисуйте «битмап bmp», используя «Graphics g = Graphics.FromImage (bmp)», либо в событии «Paint» элемента управления, используя параметр 'e.Graphics'. – TaW

ответ

2

Просто образец быстро и грязно, если ваш "GFX" является "e.Graphics ..." из формы:

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

спасибо! чувак! Вы много помогли – Kill4lyfe

0

Rectangle имеет несколько удобных, но часто упускается из виду функции. В этом случае с помощью функции Rectangle.Contains(Point) является лучшим решением:

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

Чтобы определить, если вы нажали на контуре вы хотите, чтобы принять решение о шириной, так как пользователь не может легко ударил одного пиксели.

Для этого вы можете использовать либо 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 

} 

..or придерживаться прямоугольников ..:

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 
}