C# 如何用C语言并行绘制两种不同的图形#

C# 如何用C语言并行绘制两种不同的图形#,c#,plot,C#,Plot,我正在使用picturebox、按钮和复选框在C#中开发GUI。我需要在图像上使用一个文本文件并行绘制两个不同的绘图。图像首先在图片框中读取。程序的其余部分必须按以下方式执行: 读取包含必须打印的数据点的文本文件 单击按钮后,程序开始执行第一个图形(矩形点)的打印,但选中复选框后,第二个图形(连续点-路径打印)打印将与第一个图形并行开始 如果未选中该复选框,则第二个图形将停止打印并消失。(因为两个图形样式使用相同的文本文件) 我需要帮助在这种情况下该怎么做,我应该为这个并行打印创建单独的线程复选

我正在使用picturebox、按钮和复选框在C#中开发GUI。我需要在图像上使用一个文本文件并行绘制两个不同的绘图。图像首先在图片框中读取。程序的其余部分必须按以下方式执行:

  • 读取包含必须打印的数据点的文本文件
  • 单击按钮后,程序开始执行第一个图形(矩形点)的打印,但选中复选框后,第二个图形(连续点-路径打印)打印将与第一个图形并行开始
  • 如果未选中该复选框,则第二个图形将停止打印并消失。(因为两个图形样式使用相同的文本文件)
  • 我需要帮助在这种情况下该怎么做,我应该为这个并行打印创建单独的线程复选框吗


    请帮帮我,我哪里弄错了?请原谅我糟糕的英语

    从我的角度来看,最简单的方法是再次将图像重新加载到图片框中,然后重新绘制其上的第一个图形对象。所以,第二个“消失了”

    附加线程没有意义,因为绘图必须只在UI线程上进行(Windows GDI+、WinForms、WPF的通用规则)

    像你的例子中这样的基本绘图速度非常快

    编辑:

    namespace PictureBoxDrawing
    {
      public partial class Form1 : Form
      {
        private Bitmap _bmpImage;
    
        public Form1()
        {
          InitializeComponent();
        }
    
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
    
          _bmpImage = new Bitmap(@"C:\Image.jpg");
          InitializePictureBox(_bmpImage);
        }
    
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
          DrawPictureBox(pictureBox1, 10, 10, checkBox1.Checked);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          DrawPictureBox(pictureBox1, 10, 10, checkBox1.Checked);
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
          InitializePictureBox(_bmpImage);
        }
    
        private void DrawPictureBox(PictureBox pb, int x, int y, bool drawBlue)
        {
          using (Graphics g = pb.CreateGraphics())
          {
            g.FillRectangle(Brushes.Red, x,y, 9,9);
    
            if(drawBlue)
              g.FillRectangle(Brushes.Blue, x, y, 7, 7);
          }
        }
    
        private void InitializePictureBox(Bitmap bmp)
        {
          pictureBox1.Image = bmp;
        }
      }
    }
    

    根据你的例子,这里是我的简化建议。将位图加载并缓存在字段中,以备将来使用。我添加了第二个按钮2,可以用来将图像重新加载到图片框中以演示行为。因为红色矩形大于蓝色矩形(9>7),所以在重画时会覆盖它。因此,如果位置不变,则无需重新加载位图。如果位置发生变化,请在调用
    DrawPictureBox
    之前调用
    InitializePictureBox

    谢谢KBO的回复,我确实有第一张图片闪烁的问题,谢谢KBO的回复,我确实有第一张图片闪烁的问题,你能指导我如何将图片重新加载到图片框中吗?我的意思是,在我的代码的哪一部分?PictureBox已经被双缓冲,并且不应该显示任何闪烁,前提是所有图形都是在绘制事件中绘制的。这是操作代码中的真正错误。实际上,在我的程序中,我不需要第二个按钮来重新加载图片框中第一个图形的图像。那么,我可以将initializepicturebox命令放在我的线程或checkbox函数中吗?@SN25:当然,这只是为了演示如何使用位图重新初始化图片框。g=pictureBox1.CreateGraphics();-Winforms graphics基本规则#1:切勿使用
    控件。CreateGraphics
    !切勿尝试缓存
    图形
    对象!使用
    Graphics g=Graphics.FromImage(bmp)
    或在控件的
    Paint
    事件中,使用
    e.Graphics
    参数将bmp绘制到
    位图中。。你可以通过执行最小化/最大化序列来测试图形的持久性。你的帖子有点不清楚。所以你在一个文本文件中有很多坐标,你想把它们打印到一个或两个图片框上。情节是一次性发生还是以动画形式发生?第二个pbox应显示相同的图像,还是仅显示第一个或最后一个图像,或者显示数据的哪一部分?是否有任何用户交互?另外:我们需要看到真实的代码或可以用来重现问题的版本。您的代码无法编译。(缺少卷发等…)。它到处都是,除非丢失的显示代码被删除。嗨,TaW,实际上我在我的程序中只使用了一个PictureBox,我想在一个图像上绘制两个图形,图像在图片框中读取。然后,单击按钮激活程序执行并将第一个图形打印为点打印,复选框为“检查此点(即第二个图形)的轨迹开始与第一个图形(即点打印)并行打印”,当复选框未选中时,轨迹打印停止并应消失。再次选中该复选框时,跟踪绘图将再次与第一个图形连续开始。