【问题标题】:Drawing a circle on a pictureBox from another winform从另一个winform在pictureBox上画一个圆圈
【发布时间】:2019-06-08 00:04:19
【问题描述】:

我的应用程序中有两个 winform。其中一个表格有一个图片框,里面有一个 jpg 加载了我们的建筑计划。主要形式具有执行面部识别识别进入某些区域的人的代码。我被要求修改这个程序,以在建筑平面图上显示一个已识别个人的位置。我有一个数据库,其中包含应映射到建筑平面图图像的位置的所有 X、Y 坐标。我环顾四周并试图找到一些代码,这些代码将通过擦除所有现有圆圈并更新这个新圆圈来在人通过建筑物区域前进时在地图上的 X、Y 坐标处绘制一个圆圈。所以在地图表单上我输入了以下代码:

public void DrawCircle(int x, int y)
    {
        Graphics gf = pictureBox1.CreateGraphics();
        gf.DrawEllipse(new Pen(Color.Red), new Rectangle(x, y, 400, 400));
        pictureBox1.Refresh();
    }

然后从主窗体上的更新方法(现在单击按钮进行测试)我在地图窗体上调用此方法。该方法被调用,但圆圈没有出现在表单上。我已经尝试过 Refresh 和 Invalidate 两种方法似乎都没有在图像上绘制圆圈。

我已经多年没有进行 winforms 开发了,所以我确定我在某处遗漏了一些管道。这是主窗体上的代码:

LocationMap map = new LocationMap();

public Form1()
{
    InitializeComponent();
    //set up signalR
    UserName = "MovementHub1";
    ConnectAsync();
    //show the map screen
    map.Show();
    map.WindowState = FormWindowState.Maximized;
    ...

然后在一个点击事件中(现在用于测试)我有这个代码:

private void button2_Click(object sender, EventArgs e)
    {
        map.DrawCircle(340, 258);
    }

一旦我在另一个表单上绘制了圆圈,然后我将从 click 事件中删除代码并将其移动到另一个对位置进行更新的事件。如果可能的话,我想在有这个人名字的圆圈旁边贴一个标签。现在这是一个概念证明,我只需要帮助在表格上画圆圈即可。

谢谢。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    我自己尝试了一下,然后想到了:

    Form1.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace StackoverflowHelp
    {
      public partial class Form1 : Form
      {
        Form2 form = new Form2();
    
        public Form1()
        {
          InitializeComponent();
          form.Show();
        }
    
        private void Button1_Click(object sender, EventArgs e)
        {
          form.DrawCircle(100, 100);
        }
      }
    }
    

    Form2.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace StackoverflowHelp
    {
      public partial class Form2 : Form
      {
        public Form2()
        {
          InitializeComponent();
    
          DrawCircle(10, 10);
        }
    
        public void DrawCircle(int x, int y)
        {
          Graphics gf = Graphics.FromImage(pictureBox1.Image);
          gf.DrawEllipse(new Pen(Color.Red), new Rectangle(x, y, 20, 20));
          gf.Dispose();
          pictureBox1.Refresh();
          pictureBox1.Invalidate();
          pictureBox1.Update();
        }
      }
    }
    

    我没有在图片框上调用CreateGraphics(),而是使用当前图像创建了图形对象。

    【讨论】:

    • 谢谢查克·诺里斯!看起来图像中的图形和更新工作。
    • @john 该图形对象需要被释放或放入 using-block。
    • 谢谢@LarsTech,我做到了。现在我将如何擦除所有圆圈以将图像刷新回最初加载的图像?
    • @john 你不能真正擦除图形。只需从原始图像创建一个图形并重新开始。
    • 谢谢@LarsTech 我只是重新加载图像,因为这只是一个概念证明,它似乎工作正常。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 2021-06-24
    • 2019-09-04
    • 2012-11-12
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多