获取具有鼠标位置定义的坐标的线

时间:2015-03-06 20:37:49

标签: c# graphics drawing line mouse

我正在尝试在屏幕上制作一个直径为100的小圆形图形程序,从它的中心开始,一条线从它出来,始终连接到鼠标指针,直到用户单击,然后永久绘制该行。它与MSPaint的线条完全相同,只是起始点始终是圆的中心。

我尝试了一些不起作用的东西。

  1. 我只能在鼠标点击后才能显示该行。那不是我想要的。我希望线条始终存在并从圆心旋转直到点击鼠标然后它永久地在屏幕上。

  2. 我可以得到一个总是在绘制线条的污点。它形成了一种星形,但这不是我想要的。

  3. 基本上,我想要在绘制线条时在MSPaint中具有相同的功能。我应该做些什么?画一条线,然后在一秒钟之后将其擦除,然后在鼠标处于新位置时再次绘制它?我尝试了类似的东西,但它确实消除了一点背景,然后只在鼠标运动时绘制线条,而不是在鼠标静止时绘制。

    如果有人可以提供代码段,那就太棒了。或者只是一些伪代码。

    这是正确的伪代码吗? 开始: 左键单击并从圆心到鼠标尖显示一条线 线路一直保持到新的鼠标坐标(如何跟踪)? 从圆心到原始位置的线被删除 新线位于鼠标坐标的新位置。

    我认为这是一种使用我在数字课上学到的状态机。如何在C#中实现状态?

    任何帮助都会受到赞赏,并感谢所有能够理解我的问题的人,即使我可能没有使用正确的术语。

1 个答案:

答案 0 :(得分:4)

如此简短的回答是你需要一些自定义绘画。答案越长,涉及自定义绘图和事件处理。

您需要的另一段代码是包含所有行的某种列表。下面的代码创建一个用户控件,并在不依赖状态机的情况下进行自定义绘制。要对其进行测试,请创建一个新项目,添加一个名为UserControl1的用户控件,并将其添加到表单中。确保您参与列出的活动。

我尝试对相关部分发表评论,这显示了一种快速而肮脏的方式来完成您似乎想要做的事情。

using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace CustomDrawingAndEvents
{
public partial class UserControl1 : UserControl
{
    private struct MyLine
    {
        public Point mStart;
        public Point mEnd;
        public MyLine(Point xStart, Point xEnd)
        {
            mStart = xStart;
            mEnd = xEnd;
        }
    }

    private List<MyLine> mLines;
    private Point mCircleCenter;
    private Point mMousePosition;

    public UserControl1()
    {
        InitializeComponent();
        mLines = new List<MyLine>();

        //Double Buffer to prevent flicker
        DoubleBuffered = true;
        //Create the center for our circle. For this just put it in the center of 
        //the control.
        mCircleCenter = new Point(this.Width / 2, this.Height / 2);
    }

    private void UserControl1_MouseClick(object sender, MouseEventArgs e)
    {
        //User clicked create a new line to add to the list.
        mLines.Add(new MyLine(mCircleCenter, e.Location));
    }

    private void UserControl1_MouseMove(object sender, MouseEventArgs e)
    {
        //Update mouse position
        mMousePosition = e.Location;
        //Make the control redraw itself
        Invalidate();
    }

    private void UserControl1_Paint(object sender, PaintEventArgs e)
    {
        //Create the rect with 100 width/height (subtract half the diameter to center the rect over the circle)
        Rectangle lCenterRect = new Rectangle(mCircleCenter.X - 50, mCircleCenter.Y - 50, 100, 100);

        //Draw our circle in the center of the control with a diameter of 100 
        e.Graphics.DrawEllipse(new Pen(Brushes.Black), lCenterRect);

        //Draw all of our saved lines
        foreach (MyLine lLine in mLines) 
            e.Graphics.DrawLine(new Pen(Brushes.Red), lLine.mStart, lLine.mEnd);            

        //Draw our active line from the center of the circle to
        //our mouse location
        e.Graphics.DrawLine(new Pen(Brushes.Blue), mCircleCenter, mMousePosition);
    }
}

}