【发布时间】:2010-09-01 07:31:20
【问题描述】:
任何建议如何通过单击两个新点然后在它们之间画一条线来创建一条线? 我正在尝试创建一个距离工具,例如 adobe acrobat 中的那个。
图片示例
【问题讨论】:
任何建议如何通过单击两个新点然后在它们之间画一条线来创建一条线? 我正在尝试创建一个距离工具,例如 adobe acrobat 中的那个。
图片示例
【问题讨论】:
问题解决了!
编辑: 代码如下:
private Point p1, p2;
List<Point> p1List = new List<Point>();
List<Point> p2List = new List<Point>();
private void Panel1_MouseDown(object sender, MouseEventArgs e)
{
if (p1.X == 0)
{
p1.X = e.X;
p1.Y = e.Y;
}
else
{
p2.X = e.X;
p2.Y = e.Y;
p1List.Add(p1);
p2List.Add(p2);
Invalidate();
p1.X = 0;
}
}
private void Panel1_Paint(object sender, PaintEventArgs e)
{
using(var p = new Pen(Color.Blue, 4))
{
for(int x = 0; x<p1List.Count; x++){
e.Graphics.DrawLine(p, p1List[x], p2List[x]);
}
}
}
【讨论】:
Panel1.CreateGraphics(),而应该使用面板的OnPaint 方法。
Refresh() 以使控件重新绘制。绘制方法由OnPaint() 处理。 这是你绘制所有东西的地方(OnPaint)。您获取当前位置并绘制它们。看看我在另一篇文章中的回答,看看我的意思。如果您在控件上绘画,则应该永远需要在活动期间调用CreateGraphics()。
您可以处理面板上的鼠标单击事件(例如)并检索单击的位置(使用事件参数)。将此位置存储在属性中。尽可能多地这样做。 在面板绘制事件中,调用父绘制,然后在您的点之间绘制线条。
【讨论】:
应该这样做:
Point firstPoint;
Point seondPoint;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (this.firstPoint == null) {
this.firstPoint = e.Location;
}
if (this.secondPoint == null) {
this.secondPoint = e.Location;
}
panel1.Invalidate();
}
private void panel1_Paint_1(object sender, PaintEventArgs e)
{
Using (pn as new Pen(Color.Blue, 5))
{
e.Graphics.DrawLine(pn, firstPoint, secondPoint);
}
}
编辑:你也不需要 CreateGraphics 来画线 - 在 Paint 事件中你已经有了一个图形对象。
【讨论】: