日期:2014-05-18  浏览次数:20730 次

请教高手,我想要做一个随鼠标移动的"十"形线
我在FORM上已经画好网络络线,且根据数据生成各种图形.
现在想做一个随鼠标移动的 "十 "形线,有点象K线图里的效果.
如果用画线实现这个效果,我不知如何删除以前的线又不影响想要的图形.

请大家指点,最好能给上代码.


------解决方案--------------------
你还要添加如下几个文(文件)类:

//对象集合定义
using System;
using System.Collections.Generic;
using System.Text;
using DrawLines.DrawObjs;
using System.Windows.Forms;
using System.Drawing;

namespace DrawLines
{
class DrawList : List <DrawBase>
{
private Control m_Owner;
public DrawList(Control owner)
{
this.m_Owner = owner;
}
internal DrawBase GetNear(int x, int y)
{
foreach (DrawBase draw in this)
{
if (draw.Near(x, y))
{
return draw;
}
}
return null;
}

internal void Draw(Graphics graphics)
{
foreach (DrawBase draw in this)
{
draw.Draw(graphics);
}
}
}
}

//对象基类定义
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace DrawLines.DrawObjs
{
abstract class DrawBase
{
internal Color m_BackColor;
internal Color m_ForeColor;
internal static int m_HalfGrab;

public static int HalfGrab
{
get { return DrawBase.m_HalfGrab; }
set { DrawBase.m_HalfGrab = value; }
}

public Color BackColor
{
get { return m_BackColor; }
set { m_BackColor = value; }
}

public Color ForeColor
{
get { return m_ForeColor; }
set { m_ForeColor = value; }
}

public abstract Rectangle GetBound();
public abstract void Draw(Graphics g);
public abstract bool Near(int x, int y);
public abstract void SetBound(Rectangle bound);
}
}

//线定义
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace DrawLines.DrawObjs
{
class LineObj : DrawBase
{
private Point m_Start;
private Point m_End;
public LineObj(Point start, Point end)
{
this.m_Start = start;
this.m_End = end;
}
public override System.Drawing.Rectangle GetBound()
{
int x = this.m_Start.X < this.m_End.X ? this.m_Start.X : this.m_End.X;
int y = this.m_Start.Y < this.m_End.Y ? this.m_Start.Y : this.m_End.Y;
int r = this.m_Start.X < this.m_End.X ? this.m_End.X : this.m_Start.X;
int b = this.m_Start.Y < this.m_End.Y ? this.m_End.Y : this.m_Start.Y;
return Rectangle.FromLTRB(x, y, r, b);
}

public override void Draw(System.Drawing.Graphics g)
{
using (Pen pen = new Pen(this.m_ForeColor))
{
g.DrawLine(pen, this.m_Start, this.m_End);
}
}

public override bool Near(int x, int y)
{
//点到直线的距离是否在抓取范围之内
float A = this.m_End.Y - this.m_Start.Y;
float B = this.m_End.X - this.m_Start.X;
float C = B * this.m_Start.Y - A * this.m_Start.X;
double D = (A * x - B * y + C) / (Math.Sqrt(A * A + B * B));
if (D > = -m_HalfGrab && D <= m_HalfGrab)
{
RectangleF bounds = this.GetBound();
bounds.Inflate(m_HalfGrab, m_HalfGrab);
return bounds.Contains(x, y);
}
return false;
}

public override void SetBound(Rectangle bound)
{
this.m_Start = new