【发布时间】:2018-10-04 08:39:16
【问题描述】:
在应用程序中,我正在尝试绘制具有用户定义的宽度和高度的形状。然后当它绘制时,我尝试修改它的笔画粗细。
像这样:
这一切都很好,直到我将它保存为一个对象并一遍又一遍地重绘它。当我再次尝试绘制某些东西,并尝试放大笔画粗细并缩小比例时,它会将绘图保留为灰色,只有当绘图被接受时才适用。 Red Line 是当前绘制的形状,而其背面的 gray 是我的问题。我还没接受呢。
代码如下:
主窗体
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);
}
}
【问题讨论】: