Как проверить, щелкнула ли мышь прямоугольник?Я сделал прямоугольник, как проверить, нажата ли на нем мышь?
Graphics gfx;
Rectangle hitbox;
hitbox = new hitbox(50,50,10,10);
//TIMER AT THE BOTTOM
gfx.Draw(System.Drawing.Pens.Black,hitbox);
Как проверить, щелкнула ли мышь прямоугольник?Я сделал прямоугольник, как проверить, нажата ли на нем мышь?
Graphics gfx;
Rectangle hitbox;
hitbox = new hitbox(50,50,10,10);
//TIMER AT THE BOTTOM
gfx.Draw(System.Drawing.Pens.Black,hitbox);
Просто образец быстро и грязно, если ваш "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";
}
}
}
спасибо! чувак! Вы много помогли – Kill4lyfe
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
}
Что ваш 'gfx' см? – Tommy
Если ваш «gfx» является «e.Graphics ...» из формы, то просто используйте событие MouseDown, есть e.X и e.Y. –
Никогда не используйте 'control.CreateGraphics'! Никогда не пытайтесь кэшировать объект «Graphics»! Либо рисуйте «битмап bmp», используя «Graphics g = Graphics.FromImage (bmp)», либо в событии «Paint» элемента управления, используя параметр 'e.Graphics'. – TaW