画连续线条:即利用控件的MouseMove事件,对每次移动进行DrawLine C#
2个回答
展开全部
以下效果图
以下代码
[STAThread]
public static void Main(string[] args)
{
var panel = new MyPanel();
panel.Dock = DockStyle.Fill;
DrawLines(panel);
var form = new Form();
form.Controls.Add(panel);
form.ShowDialog();
}
// 为了方便,直接在一个函数中完成
private static void DrawLines(Panel panel)
{
// 保存绘制点,为了简单,只保存系列个绘制点的坐标,
// 根据需要可以加入系列个绘制点间的颜色及线型
var points = new List<Point>();
// 界面重绘
panel.Paint += (sender, args) =>
{
if (points.Count >= 2)
{ // 绘制出所有绘制点之间的线条,这里为了方便,直接将颜色/线型写入代码中
// 可以根据需要从界面设置中获取参数
using (var pen = new Pen(Color.Black, 2))
{
args.Graphics.DrawLines(pen, points.ToArray());
}
}
if (points.Count > 0)
{// 绘制出最后一个与当前鼠标点之间的线条,这里为了方便,直接将颜色/线型写入代码中
// 可以根据需要从界面设置中获取参数
using (var pen = new Pen(Color.Red, 2))
{
var curPostion = panel.PointToClient(Cursor.Position);
pen.DashStyle = DashStyle.DashDot;
args.Graphics.DrawLine(pen, points.Last(), curPostion);
}
}
};
// 鼠标移动时直接要求重绘
panel.MouseMove += (sender, args) => panel.Invalidate();
// 单击时根据左键或是右键加入绘制点或是清空所有绘制点,然后重绘
panel.MouseClick += (sender, args) =>
{
if (args.Button == MouseButtons.Left)
{
points.Add(new Point(args.X, args.Y));
}
else if (args.Button == MouseButtons.Right)
{
points.Clear();
}
panel.Invalidate();
};
}
}
internal class MyPanel : Panel
{
public MyPanel()
{
// 用双缓存,绘制时不会闪烁
DoubleBuffered = true;
}
}
展开全部
这个简单啊,只要把画直线的方法中点的坐标改为鼠标的位置就行了:
e.X,e.Y,分别代表鼠标当前位置的横坐标和纵坐标。
声明两个全局变量:x,y,用于获取鼠标进入画板的位置(这里,我用标签来当画板):
Graphics g;
int x, y;
private void label2_MouseMove(object sender, MouseEventArgs e)
{
g=label2.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X; //让下个线段的起点为当前鼠标坐标
y = e.Y;
}
但是,这种方法画出来的不是你想要的直线段,因为鼠标的坐标变化很小,单位为1,画出来会是曲线段。建议不要使用鼠标移动事件,而是鼠标单击事件,每次单击确定一个点:
private void label2_MouseDown(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
g = label2.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X;
y = e.Y;
}
这样做,线条永远从窗口左上角开始起点。要想从窗口中单击某个点做为起点,程序如下修改:
private void label2_MouseDown(object sender, MouseEventArgs e)
{
g = label2.CreateGraphics();
Pen p = new Pen(Color.Black);
if (x == 0 && y == 0)
{
x = e.X;
y = e.Y;
}
else
{
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X;
y = e.Y;
}
e.X,e.Y,分别代表鼠标当前位置的横坐标和纵坐标。
声明两个全局变量:x,y,用于获取鼠标进入画板的位置(这里,我用标签来当画板):
Graphics g;
int x, y;
private void label2_MouseMove(object sender, MouseEventArgs e)
{
g=label2.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X; //让下个线段的起点为当前鼠标坐标
y = e.Y;
}
但是,这种方法画出来的不是你想要的直线段,因为鼠标的坐标变化很小,单位为1,画出来会是曲线段。建议不要使用鼠标移动事件,而是鼠标单击事件,每次单击确定一个点:
private void label2_MouseDown(object sender, MouseEventArgs e)
{
x = e.X;
y = e.Y;
g = label2.CreateGraphics();
Pen p = new Pen(Color.Black);
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X;
y = e.Y;
}
这样做,线条永远从窗口左上角开始起点。要想从窗口中单击某个点做为起点,程序如下修改:
private void label2_MouseDown(object sender, MouseEventArgs e)
{
g = label2.CreateGraphics();
Pen p = new Pen(Color.Black);
if (x == 0 && y == 0)
{
x = e.X;
y = e.Y;
}
else
{
g.DrawLine(p, x, y, e.X, e.Y);
x = e.X;
y = e.Y;
}
更多追问追答
追答
if (x == 0 && y == 0)
{
x = e.X;
y = e.Y;
F = new Point(x, y);
}
else
{
S = new Point(e.X, e.Y);
DrawShape(g,F,S); //S后面的三个参数你自己添加一下就行了
S = F;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询