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

C# 获取具有鼠标位置定义的坐标的直线,c#,graphics,drawing,line,mouse,C#,Graphics,Drawing,Line,Mouse,我正在尝试制作一个小的图形程序,它在屏幕上有一个直径为100的圆,从它的中心,一条线从里面出来,一直连接到鼠标指针,直到用户点击,然后这条线被永久地画出来。它与MSPaint的直线完全相同,只是起点始终是圆的中心 我试过一些不起作用的东西 我只能在鼠标单击后才能显示该行。那不是我想要的。我希望直线始终存在并从圆心旋转,直到单击鼠标,然后它就永久地出现在屏幕上 我可以得到一个污迹的东西,那里的线总是被画出来的。它有点像星星,但这也不是我想要的 基本上,我想要的功能与您在MSPaint中绘制直线时的

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

我试过一些不起作用的东西

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

我可以得到一个污迹的东西,那里的线总是被画出来的。它有点像星星,但这也不是我想要的

基本上,我想要的功能与您在MSPaint中绘制直线时的功能相同。我该怎么办?画线,然后在一秒钟后将其擦除,然后在鼠标处于新位置时再次绘制?我尝试过类似的方法,但它会稍微擦除背景,然后只在鼠标移动时绘制线条,而不是在鼠标静止时绘制

如果有人能提供代码片段,那就太好了。或者只是一些伪代码

这是正确的伪代码吗? 开始: 单击鼠标左键,从圆心到鼠标顶端会出现一条线 在创建新的鼠标坐标之前,线一直保持在那里。如何跟踪? 从圆心到原始位置的直线被删除 新行将创建到鼠标坐标的新位置

我认为这有点像一台状态机,可以利用我在数字课堂上学到的东西。如何在C中实现状态


感谢所有能够理解我的问题的人,尽管我可能没有使用正确的术语。

简单的回答是,你需要一些定制的绘画。较长的答案涉及自定义绘图和事件处理

您需要的另一段代码是某种类型的列表,用于保存所有行。下面的代码创建一个用户控件,并在不依赖状态机的情况下进行自定义绘制。要测试它,请创建一个新项目,添加一个名为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);
    }
}

}

你应该做的第一件事是进一步思考。你所描述的很简单,但我认为你不会就此止步。为你想做的事制定更好的计划!第二件事是了解GDI+图形模型,也就是说,如果您想使用Winforms。。这里的键是要绘制的控件或窗体的绘制事件和MouseMove事件..-忽略答案的开头,处理分层控件。。!关于在哪里可以学到一些关于低级图形和GDI+的知识,有什么建议吗?我想做一些基本上展示几何教科书中原理的事情。Winforms和GDI+是相当古老/过时/成熟的技术。但仍然是最受欢迎的。还有很多教程。此外,你可能想看看我在这里的一些帖子,在这里我向像这样的新手解释了绘制到曲面或位图之间的区别的基本方法[,..忽略WPF狂热者的恶意否决票,或者忽略创建分层图形程序所需的详细操作。-你可能还想看看哪一个是基础和高级技术的良好组合。我仍然喜欢Matthew MacDonald的,它是关于自定义你自己的控件的。谢谢你,它完全奏效了。我不支持sed想在评论中说声谢谢,因为这可能会给讨论增添混乱,但显然你在回复中花了一些时间。至少我能说的是谢谢你。