在C#中的一个背景图像上创建不同的可点击部分

时间:2015-04-10 16:53:04

标签: c# winforms picturebox

我需要在表单背景中创建一个带有一个图像的C#Windows窗体应用程序。单击图像的10个不同部分将导致发生不同的事件/操作。如何使图像的不同部分可以点击?

谢谢!

2 个答案:

答案 0 :(得分:2)

在最简单的情况下,你要做的就是创建一个

List<Rectangle> rects  = new List<Rectangle>();

用坐标填充它们:

   rects.Add(new Rectangle(11,22,55,55));
   rects.Add(new Rectangle(66,22,55,55));
   //..

并检查MouseClick事件:

private void Form1_MouseClick(object sender, MouseEventArgs e)
{
    foreach (Rectangle r in rects)
        if (r.Contains(e.Location))
        {
            // do things here
            Console.WriteLine("You have hit Rectangle no.: " + rects.IndexOf(r));
        }
}

如果你愿意,你可以创建一个更复杂的类(或结构)来保存不仅仅是一个矩形列表并用它们存储其他数据,比如ID或其他参数,甚至代表指向你想要的动作的代表要做..

对于更复杂的图像地图,我发现最简单但最强大的方法是将它们创建为与图像大小相同的位图,根据需要对它们进行着色,并通过使用MouseClick位置作为查找来读出颜色。存储在内存中的位图..

更新:对于发布的图片,最简单的解决方案是创建一个列表并对其进行检查:

List<Color> colors = new List<Color>();

添加颜色:

colors.Add(Color.Brown);
//..


private void Form1_MouseClick(object sender, MouseEventArgs e)
{

   Color cHit = ((Bitmap)this.BackgroundImage).GetPixel(e.X, e.Y);
    foreach (Color c in colors )
        if (cHit .ToArgb() == c.ToArgb())
        {
            // do things here
            Console.WriteLine("You have hit Rectangle no.: " + colors .IndexOf(c) + " with Color " + cHit.ToString());
        }

显然,只有当颜色列表与图像具有相同的颜色时,这才有效!如果您自己创建图像很容易;否则你将再次需要注意正确创建列表!

注意:如果您使用Form.BackgroundImage,请确保将BackgroundImageLayout设置为None,否则鼠标点击的坐标将与这些坐标不匹配图像中的像素!如果你想要Center,你需要计算偏移量!使用PanelPictureBox会更灵活。

答案 1 :(得分:0)

你需要在你的形象上画画。制作固定尺寸的画布,在其上附加活动