2016-06-13 5 views
0

создать код податливость, что позволит мне изменить размер круга и переместить егоRe и значительного Movable Circle

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

} 
} 
+0

Попробуйте поставить код в '' Form1_MouseDown' в OnMouseClick'. Это разные события. – afaolek

+0

Как вы планируете позволить пользователю прервать/очистить первый клик? – TaW

+0

Спасибо за помощь. Я понял. – user6425922

ответ

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

} 

}

 Смежные вопросы

  • Нет связанных вопросов^_^