我需要帮助解决一个我不知道如何解决问题的问题.我有自己的类从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(); }
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); }
结果我有:
左边的矩形是带有圆圈绘图的pictureBox.右边的矩形是没有圆的pictureBox,原始的矩形.
我希望得到的结果:
圆圈围绕矩形绘制.
为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); } }
结果(我点击图片框顺便说一句:));
希望有帮助,
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。