画连续线条:即利用控件的MouseMove事件,对每次移动进行DrawLine C#

 我来答
哲事姓无
2014-05-17 · TA获得超过1176个赞
知道小有建树答主
回答量:903
采纳率:100%
帮助的人:430万
展开全部

以下效果图

以下代码

   [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;
    }
}
凌海樱
2014-05-16 · TA获得超过401个赞
知道小有建树答主
回答量:445
采纳率:100%
帮助的人:245万
展开全部
这个简单啊,只要把画直线的方法中点的坐标改为鼠标的位置就行了:
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;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式