加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

结果我有:
左边的矩形是带有圆圈绘图的pictureBox.右边的矩形是没有圆的pictureBox,原始的矩形.

enter image description here

我希望得到的结果:
圆圈围绕矩形绘制.

enter image description here

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

}

结果(我点击图片框顺便说一句:));

enter image description here

希望有帮助,

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读