Getting a line that has the coordinates defined by the mouse location

两盒软妹~` 提交于 2019-12-11 02:39:47

问题


I'm trying to make a little graphics program that has a circle of diameter 100 on the screen and from the center of it, a line is coming out of it that is always attached to the mouse pointer until such time that the user does a click, and then the line is permanently drawn. It's exactly like MSPaint's line, except that starting point is always the center of the circle.

I tried a few things that DON'T work.

  1. I can get the line to appear only after a mouse-click. That's not what I want. I want the line to always be present and pivoting from the circle-center until the mouse is clicked and then it's then permanently on the screen.

  2. I can get a smeary thing where the line is always being drawn. It makes a sort of star shape, but that's not what I want either.

Basically, I want the same functionality that you have in MSPaint when you draw a line. What am I supposed to do? Draw the line and then erase it a second later, and then draw it again when the mouse is in a new position? I tried something like that, but it does a thing where it erases the background a little bit, and then the line is only drawn when the mouse is in motion, but not when the mouse is stationary.

If anyone can provide a code snippet, that'd be great. Or just some pseudo-code.

Is this the right pseudo code? Start: Left click and a line appears from center of circle to mouse tip Line stays there until a new mouse coordinate is made (how do I keep track)? Line from center of circle to original location gets erased New line is made to new location of mouse coordinates.

I think this something of a state-machine to use what I learned in digital class. How are states implemented in C#?

Any help would be appreciated, and thanks to everyone that can understand my question even though I'm probably not using the proper terminology.


回答1:


So short answer is you will need some custom painting. The longer answer involves custom drawing, and event handling.

The other piece of code you need is a list of some sort to hold all of the lines. The code below creates a user control and does the custom painting without relying on a state machine. To test it, create a new project add a user control called UserControl1, and add it to a form. Make sure you tie into the listed events.

I tried to comment the relevant sections and this shows a quick and dirty way to do what you appear to be trying to do.

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);
    }
}

}



来源:https://stackoverflow.com/questions/28907231/getting-a-line-that-has-the-coordinates-defined-by-the-mouse-location

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!