c# – 绘制时如何控制圆的大小和位置
发布时间:2020-12-15 22:42:40 所属栏目:百科 来源:网络整理
导读:我需要帮助解决一个我不知道如何解决问题的问题.我有自己的类从PictureBox延伸,我可以正确显示我的矩形,我可以毫无问题地移动它. 但是当我尝试在矩形周围画一个圆圈时,我遇到了问题.我想在用户制作一个mouseclickevent时绘制圆圈.它绘制一个圆,但在矩形上.我
我需要帮助解决一个我不知道如何解决问题的问题.我有自己的类从PictureBox延伸,我可以正确显示我的矩形,我可以毫无问题地移动它.
但是当我尝试在矩形周围画一个圆圈时,我遇到了问题.我想在用户制作一个mouseclickevent时绘制圆圈.它绘制一个圆,但在矩形上.我不知道你是否理解我…我把我的代码放在下面,也是我的结果和我想要的结果. 我的代码: OnClick事件: //Métodos para mover la unidad bool unidadPulsada = false; private Point MouseDownLocation; protected override void OnMouseDown(MouseEventArgs e) { unidadPulsada = true; base.OnMouseDown(e); MouseDownLocation = e.Location; DibujarLimites(); } 设置pictureBox的方法: public void Colocar(Control control,Unidad unidad,Point p) { unidad.Location = p; control.Controls.Add(unidad); } 绘制方法: public void DibujarLimites() { using (Graphics g = CreateGraphics()) { using (Pen pen = new Pen(Color.Red,2)) { float[] dashValues = { 5,2,15,4 }; pen.DashPattern = dashValues; DrawCircle(g,pen,20); } } } public void DrawCircle(Graphics g,Pen pen,float centerX,float centerY,float radius) { g.DrawEllipse(pen,centerX - radius,centerY - radius,radius + radius,radius + radius); } 结果我有: 我希望得到的结果: 为Youri编辑: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; using System.Windows.Forms; using WHF.Properties; namespace WHF { public class Unidad : PictureBox { //Constructor public Unidad(string nombre,string tipo,int movimiento,int ha,int hp,int fuerza,int resistencia,int heridas,int iniciativa,int ataques,int liderazgo,int coste,string rutaImagen) { tipoUnidad = tipo; movimientoUnidad = movimiento; nombreUnidad = nombre; costeUnidad = coste; haUnidad = ha; hpUnidad = hp; fuerzaUnidad = fuerza; resistenciaUnidad = resistencia; iniciativaUnidad = iniciativa; ataquesUnidad = ataques; liderazgoUnidad = liderazgo; rutaImagenUnidad = rutaImagen; } //Propiedades public string nombreUnidad { get; set; } public string tipoUnidad { get; set; } public int movimientoUnidad { get; set; } public int costeUnidad { get; set; } public int haUnidad { get; set; } public int hpUnidad { get; set; } public int fuerzaUnidad { get; set; } public int resistenciaUnidad { get; set; } public int heridasUnidad { get; set; } public int iniciativaUnidad { get; set; } public int ataquesUnidad { get; set; } public int liderazgoUnidad { get; set; } public string rutaImagenUnidad { get; set; } //Método para dibujar unidad public void Colocar(Control control,Point p) { unidad.Location = p; control.Controls.Add(unidad); } //Métodos para mover la unidad bool unidadPulsada = false; private Point MouseDownLocation; protected override void OnMouseDown(MouseEventArgs e) { unidadPulsada = true; base.OnMouseDown(e); MouseDownLocation = e.Location; //DibujarLimites(); float x = Location.X + e.X; float y = Location.Y + e.Y; Graphics graphics = CreateGraphics(); PointF center = new PointF(x,y);//this.ClientSize.Width / 2F,this.ClientSize.Height / 2F); float radius = 100; PointF rectOrigin = new PointF(center.X - radius,center.Y - radius); RectangleF r = new RectangleF(rectOrigin,new SizeF(radius * 2F,radius * 2F)); using (Pen p = new Pen(Color.Red,4)) { p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; graphics.DrawEllipse(p,r); } } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (unidadPulsada) { Left = e.X + Left - MouseDownLocation.X; Top = e.Y + Top - MouseDownLocation.Y; } } protected override void OnMouseUp(MouseEventArgs e) { unidadPulsada = false; base.OnMouseDown(e); LimpiarLimites(); } //Método para dibujar la zona límite de movimiento de la unidad public void DibujarLimites() { using (Graphics g = CreateGraphics()) { using (Pen pen = new Pen(Color.Red,20); } } } //Método para limpiar el dibujo de la zona límite public void LimpiarLimites() { } public void DrawCircle(Graphics g,radius + radius); } public void FillCircle(Graphics g,Brush brush,float radius) { g.FillEllipse(brush,radius + radius); } } } 解决方法
好的,这是一个例子,我尝试以与你相同的方式应用,我创建了自己的图片框,
class MyPBox : PictureBox { public MyPBox() { this.BackColor = Color.Red; // for see better this.Location = new Point(50,50); // set location at form } protected override void OnPaint(PaintEventArgs pe) { if (this.Parent != null) { this.Parent.Paint += Parent_Paint; // picturebox's paint means it added to parent so we need to trigger parent's paint event } base.OnPaint(pe); } bool clickPerformed = false; // to catch control has mouse down protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); clickPerformed = true; // set mouse down Control tempSender = this.Parent; // get sender tempSender.Invalidate(); // invalidate to trigger paint event } private void Parent_Paint(object sender,PaintEventArgs e) { if (clickPerformed) { using (Graphics g = e.Graphics) { using (Pen pen = new Pen(Color.Black,2)) { float locationX = this.Location.X + this.Size.Width / 2; float locationY = this.Location.Y + this.Size.Height / 2; float radius = (this.Size.Height + this.Size.Width) / 2; float[] dashValues = { 5,4 }; pen.DashPattern = dashValues; DrawCircle(g,locationX,locationY,radius); // draw circle clickPerformed = false; // process done so set it to false } } } base.OnPaint(e); } protected override void OnMouseUp(MouseEventArgs e) { this.Parent.Invalidate(); // mouse up circle should be erased,so invalidate again to trigger paint,but this time clickPerformed is false // so it won't draw circle again base.OnMouseDown(e); } public void DrawCircle(Graphics g,radius + radius); } } 结果(我点击图片框顺便说一句:)); 希望有帮助, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |