绘制圆时如何控制圆的大小和位置
How to control size and location of circle when I draw it
我需要帮助解决一个我不知道如何解决的问题。我有自己的 class,它从 PictureBox 延伸而来,我可以正确显示我的矩形,并且可以毫无问题地移动它。
但是当我试图在矩形周围画一个圆时,我遇到了问题。我想在用户进行鼠标点击事件时绘制圆圈。它画了一个圆,但在矩形上。我不知道你是否理解我......我把我的代码放在下面,还有我得到的结果和我想要的结果。
我的代码:
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, 0, 0, 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, Unidad unidad, 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, 2))
{
float[] dashValues = { 5, 2, 15, 4 };
pen.DashPattern = dashValues;
DrawCircle(g, pen, 0, 0, 20);
}
}
}
//Método para limpiar el dibujo de la zona límite
public void LimpiarLimites()
{
}
public void DrawCircle(Graphics g, Pen pen, float centerX, float centerY, float radius)
{
g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
public void FillCircle(Graphics g, Brush brush, float centerX, float centerY, float radius)
{
g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
}
}
把它放在图片框的 onclick 事件中,你应该没问题
float x = Location.X + e.X;
float y = Location.Y + e.Y;
Form form = (Form)this.FindForm();
Graphics graphics = form.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.Blue, 4))
{
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
graphics.DrawEllipse(p, r);
}
0,0 是图片框的左上角。你想做的是
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, this.height/2, this.width/2, 20);
}
}
}
好的,这是一个例子,我尝试按照你的方式应用,我创建了自己的图片框,
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, 2, 15, 4 };
pen.DashPattern = dashValues;
DrawCircle(g, pen, 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, Pen pen, float centerX, float centerY, float radius)
{
g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
}
结果(顺便说一句,我正在点击图片框 :));
希望有所帮助,
我需要帮助解决一个我不知道如何解决的问题。我有自己的 class,它从 PictureBox 延伸而来,我可以正确显示我的矩形,并且可以毫无问题地移动它。
但是当我试图在矩形周围画一个圆时,我遇到了问题。我想在用户进行鼠标点击事件时绘制圆圈。它画了一个圆,但在矩形上。我不知道你是否理解我......我把我的代码放在下面,还有我得到的结果和我想要的结果。
我的代码:
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, 0, 0, 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, Unidad unidad, 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, 2))
{
float[] dashValues = { 5, 2, 15, 4 };
pen.DashPattern = dashValues;
DrawCircle(g, pen, 0, 0, 20);
}
}
}
//Método para limpiar el dibujo de la zona límite
public void LimpiarLimites()
{
}
public void DrawCircle(Graphics g, Pen pen, float centerX, float centerY, float radius)
{
g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
public void FillCircle(Graphics g, Brush brush, float centerX, float centerY, float radius)
{
g.FillEllipse(brush, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
}
}
把它放在图片框的 onclick 事件中,你应该没问题
float x = Location.X + e.X;
float y = Location.Y + e.Y;
Form form = (Form)this.FindForm();
Graphics graphics = form.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.Blue, 4))
{
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
graphics.DrawEllipse(p, r);
}
0,0 是图片框的左上角。你想做的是
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, this.height/2, this.width/2, 20);
}
}
}
好的,这是一个例子,我尝试按照你的方式应用,我创建了自己的图片框,
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, 2, 15, 4 };
pen.DashPattern = dashValues;
DrawCircle(g, pen, 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, Pen pen, float centerX, float centerY, float radius)
{
g.DrawEllipse(pen, centerX - radius, centerY - radius, radius + radius, radius + radius);
}
}
结果(顺便说一句,我正在点击图片框 :));
希望有所帮助,