简体   繁体   English

如何检测面板上绘制的不规则图像的点击

[英]How to detect a click on irregular image drawn on a panel

actually i am drawing an image on a panel.the image was in irrigular shape. 实际上我在panel.image上绘制图像是不规则的形状。 For a mouse click i want to display a message wheather the click was done on the image or on the panel. 单击鼠标后,我想显示一条消息,单击已在图像或面板上完成。

You can use Region Class and its Intersect Method in order to achieve your goal, but probably there exist better solutions. 您可以使用Region Class及其相交方法来实现您的目标,但是可能存在更好的解决方案。 However, until you found them, try the following one based on the example of capturing mouse point in ellipse drawed on the panel. 但是,直到找到它们为止,以捕获面板上绘制的椭圆形鼠标点为例,尝试以下一种方法。

Declare fields: 声明字段:

private readonly GraphicsPath _graphicsPath;
private readonly Region _region;
private readonly Graphics _panelGraphics;

Initialize above fields: 初始化以上字段:

_graphicsPath = new GraphicsPath();
_graphicsPath.AddEllipse(100, 100, 100, 100); // Path that contains simple ellipse. You can add here more shapes and combine them in similar manner as you draw them.
_region = new Region(_graphicsPath); // Create region, that contains Intersect method.
_panelGraphics = panel1.CreateGraphics(); // Graphics for the panel.

Panel paint event handle: 面板油漆事件句柄:

private void panel_Paint(object sender, PaintEventArgs e)
{
    _panelGraphics.FillEllipse(Brushes.Red, 100, 100, 100, 100); // Draw your structure.
}

Panel mouse down event handle: 面板鼠标按下事件句柄:

private void panel_MouseDown(object sender, MouseEventArgs e)
{
    var cursorRectangle = new Rectangle(e.Location, new Size(1, 1)); // We need rectangle for Intersect method.
    var copyOfRegion = _region.Clone(); // Don't break original region.
    copyOfRegion.Intersect(cursorRectangle); // Check whether cursor is in complex shape.

    Debug.WriteLine(copyOfRegion.IsEmpty(_panelGraphics) ? "Miss" : "In");
}

Below is scenario for drawing just image on a panel: 以下是在面板上仅绘制图像的方案:

Declare fields: 声明字段:

private readonly Bitmap _image;
private readonly Graphics _panelGraphics;

Initialize fields: 初始化字段:

_image = new Bitmap(100, 100); // Image and panel have same size.
var imageGraphics = Graphics.FromImage(_image);
imageGraphics.FillEllipse(Brushes.Red, 10, 10, 50, 50); // Some irregular image.

panel2.Size = new Size(100, 100);
panel2.BackColor = Color.Transparent; // Panel's background color is transparent.
_panelGraphics = panel2.CreateGraphics();

Panel paint event handle: 面板油漆事件句柄:

private void panel_Paint(object sender, PaintEventArgs e)
{
    _panelGraphics.DrawImageUnscaled(_image, 0, 0);
}

Panel mouse down event handle: 面板鼠标按下事件句柄:

private void panel_MouseDown(object sender, MouseEventArgs e)
{
    Debug.WriteLine(_image.GetPixel(e.Location.X, e.Location.Y).A != 0 ? "In" : "Miss");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM