重量级和可移动的圆圈

时间:2016-06-13 09:25:59

标签: c# drawing

我创建了一个代码,允许我调整一个圆圈并移动它

  1. 首先点击鼠标,给我圆圈的中心。

  2. 圆弧半径随光标移动而变化(距中心较小半径更远,距离中心较大半径)。

  3. 第二次点击半径不会改变,圆圈将被最终确定。

  4. 这是一张类似于我想要的图像:

    http://lh6.ggpht.com/_wQH6U92SY04/S_6lAJI7E-I/AAAAAAAAKwE/i-Jkq-nI5Ss/GoogleMapCircle%5B11%5D.gif?imgmax=800

    问题是:

    1. 中心不是我第一次点击鼠标的地方。

    2. 移动光标时光标应该正好在圆边框处。

    3. 最大的问题是第二次点击圆圈离中心越远。

    4. 请帮助

      using System;
      using System.Drawing;
      using System.Windows.Forms;
      
      namespace project
      {
      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
              this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
              this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
          }
      
      
      
          Bitmap background;
          Graphics scG;
          Rectangle rectangleObj;
          int clikno = 0;
          private Point clickCurrent = Point.Empty;
          private Point clickPrev = Point.Empty;
      
      
      
          private void Form1_Load(object sender, EventArgs e)
          {
              background = new Bitmap(this.Width, this.Height);
              rectangleObj = new Rectangle(10, 10, 100, 100);
              scG = Graphics.FromImage(background);
      
          }
      
          private void Form1_MouseDown(object sender, MouseEventArgs e)
          {
              clickCurrent = this.PointToClient(Cursor.Position);
             clickPrev = clickCurrent;
              rectangleObj.X = e.X;
              rectangleObj.Y = e.Y;
          }
      
          protected override void OnPaint(PaintEventArgs pe)
          {
              pe.Graphics.DrawImage(Draw(), 0, 0);
      
          }
      
      
          public Bitmap Draw()
          {
              Graphics scG = Graphics.FromImage(background);
              Pen myPen = new Pen(System.Drawing.Color.Red, 3);
              scG.Clear(SystemColors.Control);
              scG.DrawEllipse(myPen, rectangleObj);
              return background;
      
          }
      
          protected override void OnMouseClick(MouseEventArgs e)
          {
              base.OnMouseClick(e);
              clikno = clikno + 1;
          }
      
          protected override void OnMouseMove(MouseEventArgs e)
          {
              base.OnMouseMove(e);
             double oradius = Math.Sqrt((Math.Pow(clickPrev.X - e.X, 2)) + (Math.Pow(clickPrev.Y - e.Y, 2)));
             int radius = Convert.ToInt32(oradius);
      
              if (clikno == 1)
              {
      
                      rectangleObj.Height = radius;
                      rectangleObj.Width = radius;
                  rectangleObj.X = clickPrev.X; 
                  rectangleObj.Y = clickPrev.Y; 
                  Refresh();
              }
              if (clikno == 2)
                  clikno = 0;
              Refresh();
          }
      
      }
      }
      

1 个答案:

答案 0 :(得分:0)

我想通了

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace Project
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    }

    Bitmap background;
    Graphics scG;
    Rectangle rectangleObj;
    Rectangle center;

    int clikno = 0;
    private Point clickCurrent = Point.Empty;
    private Point clickPrev = Point.Empty;



    private void Form1_Load(object sender, EventArgs e)
    {
        background = new Bitmap(this.Width, this.Height);//, this.Width,this.Height);
        rectangleObj = new Rectangle(10, 10, 100, 100);
        center = new Rectangle(10, 10, 3, 3);
        scG = Graphics.FromImage(background);

    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        clickCurrent = this.PointToClient(Cursor.Position);
        clickPrev = clickCurrent;
        if (clickPrev == Point.Empty) return;
        Refresh();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        pe.Graphics.DrawImage(Draw(), 0, 0);

    }


    public Bitmap Draw()
    {
        Graphics scG = Graphics.FromImage(background);
        Pen myPen = new Pen(System.Drawing.Color.Red, 3);
        scG.Clear(SystemColors.Control);
        scG.DrawEllipse(myPen, rectangleObj);
      //  scG.DrawRectangle(myPen, rectangleObj);
        scG.DrawEllipse(myPen, center);

        return background;

    }

    protected override void OnMouseClick(MouseEventArgs e)
    {
        base.OnMouseClick(e);
        clikno = clikno + 1;
    }






    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
       double oradius = Math.Sqrt((Math.Pow(clickPrev.X - e.X, 2)) + (Math.Pow(clickPrev.Y - e.Y, 2)));
     int radius = Convert.ToInt32(oradius);

        if (clikno == 1)
        {

           rectangleObj.Height = radius;
           rectangleObj.Width = radius;
            rectangleObj.X = clickPrev.X- rectangleObj.Height /2;// +radius; 
            rectangleObj.Y = clickPrev.Y - rectangleObj.Width / 2;// +radius; 
            center.X = clickPrev.X - center.Height / 2;// +radius; 
            center.Y = clickPrev.Y - center.Width / 2;// +radius; 
            Refresh();
        }
        if (clikno == 2)
            clikno = 0;
        Refresh();
    }
    string myString = 5.ToString();

}

}