您必须调用面板上的 Invalidate 方法:
private void drawPanel_MouseUp(object sender, MouseEventArgs e)
{
onMouseUpFlag = true;
drawPanel.Invalidate();
}
另外,使用 PaintEvent 中的 Graphic 对象:
private void drawPanel_Paint(object sender, PaintEventArgs e)
{
if (onMouseUpFlag)
{
e.Graphics.DrawLine(p, ps, pe);
}
}
对于多条线,您必须将点保存在集合对象中。
根据您更新的代码,这是我认为您正在尝试执行的操作的一个工作示例:
private class Line {
public Point Starting { get; set; }
public Point Ending { get; set; }
public Line(Point starting, Point ending) {
this.Starting = starting;
this.Ending = ending;
}
}
List<Line> lines = new List<Line>();
private Point downPoint = Point.Empty;
private Point movePoint = Point.Empty;
private bool movingLine = false;
public Form1() {
InitializeComponent();
panel1.Paint += panel1_Paint;
panel1.MouseDown += panel1_MouseDown;
panel1.MouseMove += panel1_MouseMove;
panel1.MouseUp += panel1_MouseUp;
}
void panel1_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
downPoint = e.Location;
}
}
void panel1_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
movingLine = true;
movePoint = e.Location;
panel1.Invalidate();
}
}
void panel1_MouseUp(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
movingLine = false;
lines.Add(new Line(downPoint, e.Location));
panel1.Invalidate();
}
}
void panel1_Paint(object sender, PaintEventArgs e) {
e.Graphics.Clear(Color.White);
foreach (Line l in lines) {
e.Graphics.DrawLine(Pens.Black, l.Starting, l.Ending);
}
if (movingLine) {
e.Graphics.DrawLine(Pens.Black, downPoint, movePoint);
}
}
Use an 继承面板打开 DoubleBuffer 属性以避免闪烁。