【问题标题】:Re sizable and Movable Circle可调整大小和可移动的圆圈
【发布时间】:2016-06-14 09:56:35
【问题描述】:

我创建了一个代码,让我可以调整一个圆圈的大小并移动它

  1. 第一次鼠标点击给我圆的中心。

  2. 圆的半径会随着光标的移动而改变(离中心越近半径越小,离中心越远半径越大)。

  3. 第二次点击半径不变,圆最终确定。

这是一个类似于我想要做的图像:

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

问题是:

  1. 中心不是我第一次单击鼠标的位置。

  2. 当我移动它时,光标应该正好在圆的边界上。

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

请帮忙

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();
    }

}
}

【问题讨论】:

  • 尝试将Form1_MouseDown中的代码放入OnMouseClick。它们是不同的事件。
  • 你打算如何让用户中止/清除第一次点击?
  • 感谢您的帮助..我想通了..

标签: c# drawing


【解决方案1】:

我想通了

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();

}

}

【讨论】:

    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多