在应用程序中,我试图绘制具有用户定义的宽度和高度的形状。然后在绘制时,我尝试修改其笔触厚度。
像这样:
一切都很好,直到我将其另存为对象并一遍又一遍地重画。当我尝试再次绘制某些东西,并尝试按比例增加笔画的粗细并按比例缩小时,它使该图呈灰色,仅当该图被接受时才适用。 红线是当前绘制的形状,而背面的灰色是我的问题。我还没有接受。
代码如下:
主表单
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
cbox_Grid.Checked =true;
pictureBox_Canvass.Paint += draw.ShowGrid;
}
Draw draw = new Draw();
Shape s = new Shape();
Shape.Buttons buttons = new Shape.Buttons();
int rX, rY, rW, rH; //Rectangle Variables
int strokeRect;
private void cbox_Grid_CheckedChanged(object sender, EventArgs e)
{
if (cbox_Grid.Checked)
{
pictureBox_Canvass.Paint += draw.ShowGrid;
pictureBox_Canvass.Paint += DrawAll;
pictureBox_Canvass.Refresh();
}
else
{
pictureBox_Canvass.Paint += draw.ClearCanvass;
pictureBox_Canvass.Paint += DrawAll;
pictureBox_Canvass.Refresh();
}
}
#region Shape Buttons
private void btn_Rectangle_Click(object sender, EventArgs e)
{
this.tbox_Width.Text = "60";
this.tbox_Height.Text = "30";
buttons = (Shape.Buttons)System.Enum.Parse(typeof(Shape.Buttons), "rectangle");
HideButtons();
ShowSettings();
}
private void btn_Square_Click(object sender, EventArgs e)
{
buttons = (Shape.Buttons)System.Enum.Parse(typeof(Shape.Buttons), "square");
this.tbox_Width.Text = "60";
this.tbox_Height.Text = "60";
HideButtons();
ShowSettings();
}
private void btn_Circle_Click(object sender, EventArgs e)
{
buttons = (Shape.Buttons)System.Enum.Parse(typeof(Shape.Buttons), "circle");
this.tbox_Width.Text = "60";
this.tbox_Height.Text = "60";
HideButtons();
ShowSettings();
}
private void btn_Ellipse_Click(object sender, EventArgs e)
{
buttons = (Shape.Buttons)System.Enum.Parse(typeof(Shape.Buttons), "ellipse");
this.tbox_Width.Text = "60";
this.tbox_Height.Text = "30";
HideButtons();
ShowSettings();
}
private void btn_Triangle_Click(object sender, EventArgs e)
{
buttons = (Shape.Buttons)System.Enum.Parse(typeof(Shape.Buttons), "triangle");
this.tbox_Width.Text = "60";
this.tbox_Height.Text = "60";
HideButtons();
ShowSettings();
}
#endregion
#region Draw Button Event
private void btn_Draw_Click(object sender, EventArgs e)
{
pictureBox_Canvass.Refresh();
if(cbox_Grid.Checked)
{
switch (buttons)
{
case Shape.Buttons.rectangle:
pictureBox_Canvass.Paint += draw.ShowGrid;
pictureBox_Canvass.Paint += DrawAll;
pictureBox_Canvass.Paint += DrawRect;
pictureBox_Canvass.Refresh();
break;
case Shape.Buttons.square:
break;
case Shape.Buttons.circle:
break;
case Shape.Buttons.ellipse:
break;
case Shape.Buttons.triangle:
break;
}
}
else
{
switch (buttons)
{
case Shape.Buttons.rectangle:
pictureBox_Canvass.Paint += DrawAll;
pictureBox_Canvass.Paint += DrawRect;
pictureBox_Canvass.Refresh();
break;
case Shape.Buttons.square:
break;
case Shape.Buttons.circle:
break;
case Shape.Buttons.ellipse:
break;
case Shape.Buttons.triangle:
break;
}
}
}
#endregion
#region PaintEvents
public void DrawRect(object sender, PaintEventArgs e)
{
rX = (((486 / 2) - (Convert.ToInt32((Convert.ToInt32(tbox_Width.Text) * 96) / 25.4)) / 2));
rY = (((486 / 2) - (Convert.ToInt32((Convert.ToInt32(tbox_Height.Text) * 96) / 25.4)) / 2));
rW = (Convert.ToInt32((Convert.ToInt32(tbox_Width.Text) * 96) / 25.4));
rH = (Convert.ToInt32((Convert.ToInt32(tbox_Height.Text) * 96) / 25.4));
Shape shape = new Shape();
strokeRect = trackBar_Stroke.Value;
shape.strokeThickness = strokeRect;
shape.acceptRectangle(Color.Red, strokeRect, new PointF(rX, rY), rW, rH, e.Graphics);
}
public void AcceptRect(object sender, PaintEventArgs e)
{
Shape shape = new Shape();
shape.color = Color.Gray;
shape.strokeThickness = this.strokeRect;
shape.points = new PointF(rX, rY);
shape.width = rW;
shape.height = rH;
shape.DrawRectangle(Color.Gray, strokeRect, new PointF(rX, rY), rW, rH, e.Graphics);
s._shapes.Add(shape);
}
#endregion
public void DrawAll(object sender, PaintEventArgs e)
{
foreach (Shape shapes in s._shapes)
{
s.acceptRectangle(shapes.color, shapes.strokeThickness, shapes.points, shapes.width, shapes.height, e.Graphics);
}
}
#region Accept-Reset-Cancel
private void btn_Accept_Click(object sender, EventArgs e)
{
switch (buttons)
{
case Shape.Buttons.rectangle:
pictureBox_Canvass.Paint += AcceptRect;
pictureBox_Canvass.Refresh();
break;
case Shape.Buttons.square:
break;
case Shape.Buttons.circle:
break;
case Shape.Buttons.ellipse:
break;
case Shape.Buttons.triangle:
break;
}
HideSettings();
ShowButtons();
}
private void btn_Cancel_Click(object sender, EventArgs e)
{
HideSettings();
ShowButtons();
}
private void btn_Reset_Click(object sender, EventArgs e)
{
s._shapes.Clear();
rX = 0;
rY = 0;
rW = 0;
rH = 0;
if(cbox_Grid.Checked)
{
pictureBox_Canvass.Paint += draw.ClearCanvass;
pictureBox_Canvass.Paint += draw.ShowGrid;
pictureBox_Canvass.Refresh();
}
else
{
pictureBox_Canvass.Paint += draw.ClearCanvass;
pictureBox_Canvass.Refresh();
}
HideSettings();
ShowButtons();
}
#endregion
#region Methods for Hide and Show
public void HideButtons()
{
btn_Rectangle.Visible = false;
btn_Square.Visible = false;
btn_Ellipse.Visible = false;
btn_Circle.Visible = false;
btn_Triangle.Visible = false;
}
public void ShowButtons()
{
btn_Rectangle.Visible = true;
btn_Square.Visible = true;
btn_Ellipse.Visible = true;
btn_Circle.Visible = true;
btn_Triangle.Visible = true;
}
public void HideSettings()
{
btn_Draw.Visible = false;
btn_Accept.Visible = false;
btn_Cancel.Visible = false;
btn_Reset.Visible = false;
btn_Accept.Visible = false;
trackBar_Size.Visible = false;
trackBar_Stroke.Visible = false;
trackBar_Corner.Visible = false;
label_Corner.Visible = false;
label_Height.Visible = false;
label_Size.Visible = false;
label_Stroke.Visible = false;
rb_Both.Visible = false;
rb_Height.Visible = false;
rb_Width.Visible = false;
tbox_Height.Visible = false;
tbox_Width.Visible = false;
label_Width.Visible = false;
}
public void ShowSettings()
{
btn_Draw.Visible = true;
btn_Accept.Visible = true;
btn_Cancel.Visible = true;
btn_Reset.Visible = true;
btn_Accept.Visible = true;
trackBar_Size.Visible = true;
trackBar_Stroke.Visible = true;
trackBar_Corner.Visible = true;
label_Corner.Visible = true;
label_Height.Visible = true;
label_Size.Visible = true;
label_Stroke.Visible = true;
rb_Both.Visible = true;
rb_Height.Visible = true;
rb_Width.Visible = true;
tbox_Height.Visible = true;
tbox_Width.Visible = true;
label_Width.Visible = true;
}
#endregion
#region Size Scaling
private void trackBar_Stroke_Scroll(object sender, EventArgs e)
{
pictureBox_Canvass.Refresh();
switch (buttons)
{
case Shape.Buttons.rectangle:
strokeRect = trackBar_Stroke.Value;
break;
case Shape.Buttons.square:
break;
case Shape.Buttons.circle:
break;
case Shape.Buttons.ellipse:
break;
case Shape.Buttons.triangle:
break;
};
}
#endregion
#region Stroke Scaling
private void trackBar_Size_Scroll(object sender, EventArgs e)
{
switch (buttons)
{
case Shape.Buttons.rectangle:
break;
case Shape.Buttons.square:
break;
case Shape.Buttons.circle:
break;
case Shape.Buttons.ellipse:
break;
case Shape.Buttons.triangle:
break;
}
pictureBox_Canvass.Refresh();
}
#endregion
}
形状类别
public class Shape
{
public Draw draw;
public float width;
public float height;
public float x;
public float y;
public PointF points;
public int strokeThickness;
public Color color;
public List<Shape> _shapes = new List<Shape>();
public float acceptedStroke;
public enum Buttons
{
rectangle, square, circle, ellipse, triangle
}
public void DrawRectangle(Color c, int stroke, PointF points, float w, float h,Graphics g)
{
this.points = points;
this.width = w;
this.height = h;
this.strokeThickness = stroke;
g.DrawRectangle(new Pen(c,stroke), points.X, points.Y,w,h);
}
public void acceptRectangle(Color c, int stroke, PointF points, float w, float h, Graphics g)
{
this.points = points;
this.width = w;
this.height = h;
this.acceptedStroke = stroke;
g.DrawRectangle(new Pen(c, stroke), points.X, points.Y, w, h);
}
}
答案 0 :(得分:1)
事件处理程序为列表。当您这样做时:
pictureBox_Canvass.Paint += draw.ShowGrid;
您将draw.ShowGrid
添加到pictureBox_Canvass
需要绘制的方法列表中。您会一遍又一遍地重复执行多个方法,永远不要删除它们,因此每次pictureBox_Canvass
需要重绘时,所有方法都会被多次调用。
这是完全错误的。从代码中删除诸如pictureBox_Canvass.Paint +=
之类的所有内容,但不包括表单构造函数。您的pictureBox_Canvass
只需要一个Paint处理程序,该处理程序应在创建表单时创建,并且永远不要更改。实际上,如果您使用Visual Studio设计视图,则可能已经拥有其中一种。在设计视图中单击pictureBox,然后在“属性”面板中双击Paint事件,它将打开Paint处理程序。
在该处理程序中,您只需要绘制所需的线。您需要一个表单变量或其他东西来保存形状及其坐标。设置该变量,然后在单击按钮并将其绘制在“画图”处理程序中时调用pictureBox_Canvass.Invalidate()
。
How to draw shapes in WinForms中是一个非常简单的示例。
答案 1 :(得分:1)
在您的形状课程中
//Methods
public void DrawRectangle(Color c, int stroke, float w, float h, Graphics g, float radius)
{
this.width = w;
this.height = h;
this.strokeThickness = stroke;
this.type = ShapeType.rectangle;
this.radius = radius;
//Centering the Shape
PointF points = new PointF();
//w -= strokeThickness;
//h -= strokeThickness;
points.X = (center.X - ((w) / 2f));
points.Y = (center.Y - ((h) / 2f));
//Aliasing for smooth graphics when drawing and resizing
g.InterpolationMode = InterpolationMode.High;
//Drawing
RectangleF rect = new RectangleF(points.X, points.Y, w, h);
GraphicsPath path = this.GetRoundedRect(rect, radius);
g.DrawPath(new Pen(c, stroke), path);
}
public void DrawSquare(Color c, int stroke, float w, float h, Graphics g, float radius)
{
this.width = w;
this.height = h;
this.strokeThickness = stroke;
this.type = ShapeType.square;
this.radius = radius;
//w -= strokeThickness;
//h -= strokeThickness;
//Centering the Shape
PointF points = new PointF();
points.X = (center.X - (w / 2));
points.Y = (center.Y - (h / 2) + DefaultOffset);
//Aliasing for smooth graphics when drawing and resizing
g.InterpolationMode = InterpolationMode.High;
//Drawing
RectangleF rect = new RectangleF(points.X, points.Y, w, h);
GraphicsPath path = this.GetRoundedRect(rect, radius);
g.DrawPath(new Pen(c, stroke), path);
}
public void DrawCircle(Color c, int stroke, float w, float h, Graphics g)
{
this.width = w;
this.height = h;
this.strokeThickness = stroke;
this.type = ShapeType.circle;
PointF points = new PointF();
//Centering the Shape
points.X = (float)((center.X - (w/ 2)));
points.Y = (float)((center.Y - (h / 2)));
//Aliasing for smooth graphics when drawing and resizing
g.SmoothingMode = SmoothingMode.AntiAlias;
//Drawing
RectangleF rect = new RectangleF(points.X, points.Y, w, h);
g.DrawEllipse(new Pen(c, stroke), rect);
}
public void DrawEllipse(Color c, int stroke, float w, float h, Graphics g)
{
this.width = w;
this.height = h;
this.strokeThickness = stroke;
this.type = ShapeType.ellipse;
//Centering the Shape
PointF points = new PointF();
points.X = (center.X - (w / 2));
points.Y = (center.Y - (h / 2));
//Aliasing for smooth graphics when drawing and resizing
g.SmoothingMode = SmoothingMode.AntiAlias;
//Drawing
RectangleF rect = new RectangleF(points.X, points.Y, w, h);
g.DrawEllipse(new Pen(c, stroke), rect);
}
public void DrawTriangle(Color c, int stroke, float w, Graphics g, float radius)
{
this.strokeThickness = stroke;
this.type = ShapeType.triangle;
float h = (float)((w * (Math.Sqrt(3))) / 2);
PointF points = new PointF();
points.Y = (int)(((center.Y - h) + (h / 3f)) + DefaultOffset);
points.X = (int)center.X - (w / 2f);
this.size = new SizeF(w, h);
this.location = points;
//Calculation of the triangle points
RectangleF rect = new RectangleF(this.location, this.size);
PointF A = new PointF(rect.X, rect.Y + rect.Height);
PointF B = new PointF(rect.X + (rect.Width / 2f), rect.Y);
PointF C = new PointF(rect.Right, rect.Y + rect.Height);
//Drawing
GraphicsPath path = this.DrawRoundedTriangle(rect, A, B, C, radius);
g.DrawPath(new Pen(c, stroke), path);
}
#endregion
在此处致电
private void pictureBox_Canvass_Paint(object sender, PaintEventArgs e)
{
case Shape.ShapeType.rectangle:
shape.DrawRectangle(rectangleColor, strokeRect, rectangleWidth, rectangleHeight, e.Graphics, rectRadius);
break;
case Shape.ShapeType.square:
shape.DrawSquare(squareColor, strokeSquare, squareWidth, squareHeight, e.Graphics, squareRadius);
break;
case Shape.ShapeType.circle:
shape.DrawCircle(circleColor, strokeCircle, circleWidth, circleHeight, e.Graphics);
break;
case Shape.ShapeType.ellipse:
shape.DrawEllipse(ellipseColor, strokeEllipse, ellipseWidth, ellipseHeight, e.Graphics);
break;
case Shape.ShapeType.triangle:
shape.DrawTriangle(triangleColor, strokeTriangle, triangleWidth, e.Graphics, triangleRadius);
break;
}