0
我正在學習使用Windows窗體處理繪畫事件的基礎知識。C# - WInForms - 在重繪事件中處理舊圖形
到目前爲止程序類型的作品,但任何更新的圖形不會刪除以前畫出的線條(圖形不被處置)。
原始教程使用Refresh
,但似乎沒有工作,我用Invalidate
+ Update
替換它。
此外,將圖形控制設置爲this.CreateGraphics()
不起作用,我將它切換到panel2.CreateGraphics()
(我也試過e.Graphics
沒有結果)。
namespace GraphicsTutorialV1
{
public partial class Form1 : Form
{
Pen myPen = new Pen(Color.Black);
Graphics g = null;
static int start_x, start_y;
static int end_x, end_y;
static int my_angle = 0;
static int my_length = 0;
static int my_increment = 0;
static int num_lines = 0;
public Form1()
{
InitializeComponent();
Int32.TryParse(textBox1.Text, out num_lines);
Int32.TryParse(textBox2.Text, out my_angle);
Int32.TryParse(textBox3.Text, out my_length);
Int32.TryParse(textBox4.Text, out my_increment);
start_x = (panel2.Width/2);
start_y = (panel2.Height/2);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
myPen.Width = 1;
g = panel2.CreateGraphics();
//g = e.Graphics;
for(int i = 0; i < num_lines; i++)
{
drawLine();
}
}
private void drawLine()
{
int temp;
Int32.TryParse(textBox2.Text, out temp);
my_angle = my_angle + temp;
Int32.TryParse(textBox4.Text, out temp);
my_length = my_length + temp;
end_x = (int)(start_x + Math.Cos(my_angle * Math.PI/180) * my_length);
end_y = (int)(start_y + Math.Sin(my_angle * Math.PI/180) * my_length);
Point[] points =
{
new Point(start_x, start_y),
new Point(end_x, end_y)
};
start_x = end_x;
start_y = end_y;
g.DrawLines(myPen, points);
}
private void button1_Click(object sender, EventArgs e)
{
Int32.TryParse(textBox1.Text, out num_lines);
Int32.TryParse(textBox2.Text, out my_angle);
Int32.TryParse(textBox3.Text, out my_length);
Int32.TryParse(textBox4.Text, out my_increment);
this.Invalidate();
this.Update();
}
}
}
不要存儲圖形對象。只需使用繪畫事件中提供的「e.Graphics」。如果你想要面板繪畫,你必須使用面板的繪畫事件。 – LarsTech
使用CreateGraphics()繪製99.9%的所有案例都是錯誤的。如果該教程建議立即停止使用它。改爲使用面板的Paint事件。它的Invalidate()方法觸發重繪。你現在陷入成功之巔,面板的BackColor屬性完成了工作。 –
有一個來自Micrsoft的教程,開始就像使用FillEllipse作爲一個畫筆...... Arrgh。 – TaW