C# GDI+和自定义事件,高手来看

卡卡Gemini 2009-11-20 10:44:08
我要制作一个连线类,含有一个连线方法,当点击两个点时会产生连线,这个功能我已经实现。主要是采用GDI+绘制,很简单。现在想实现的功能就是点击这条连线就可以把连线消除。为此我写了一个DisLink方法。但是我不知道如何调用这个方法,因为没有相关的事件。不知道这个事件应当如何写,请高手来解答,先谢过了

附上我的连线类

class LinkLine
{


public static Point Start;
public static Point End;
public Graphics g;
public Pen pen;
public Pen DisPen;

public LinkLine(Pen pen,Pen DisPen,IntPtr hwnd)
{
this.pen = pen;
this.DisPen = DisPen;
g = Graphics.FromHwnd(hwnd);
}

public void Link()
{
g.DrawLine(pen, LinkLine.Start, LinkLine.End);
}

public void DisLink()
{
g.DrawLine(DisPen, LinkLine.Start, LinkLine.End);

}

public delegate void LineClickHandler(object sender, MouseEventArgs e);

public event LineClickHandler LineMouseClick;

public void OnLineMouseClick(object sender, MouseEventArgs e)
{
LineMouseClick(sender,e);
}
}
...全文
392 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
卡卡Gemini 2009-11-27
  • 打赏
  • 举报
回复
我做了一个控件来绘制连线,谢谢大家帮忙,结贴散分
lovelan1748 2009-11-20
  • 打赏
  • 举报
回复
把图元做成一个类吧
lovelan1748 2009-11-20
  • 打赏
  • 举报
回复
画线的时候你就得记住它的区域,并且保存起来,删除的时候判断就行了
卡卡Gemini 2009-11-20
  • 打赏
  • 举报
回复
想到个问题,现在测试我为了简单起见,画的都是直线,实际上使用的时候估计会改成贝塞尔曲线,这种方法还是不行[Quote=引用 3 楼 gomoku 的回复:]
点线距离:

其中
PointF p1:起始点
PointF p2:终点
C# codeprivatefloat GetDistanceToPoint(Point p)
{float normalX= p1.Y- p2.Y;float normalY= p2.X- p1.X;float normalLength= (float)Math.Sqrt(normalX* normalX+ normalY* normalY);if (normalLength<0.0001)return Math.Abs(p.X- p1.X)+ Math.Abs(p.Y- p1.Y);

normalX/= normalLength;
normalY/= normalLength;float distance= Math.Abs((p.X* normalX+ p.Y* normalY)- (p1.X* normalX+ p1.Y* normalY));return distance;
}
[/Quote]
卡卡Gemini 2009-11-20
  • 打赏
  • 举报
回复
这个层怎么弄???[Quote=引用 6 楼 zanfeng 的回复:]
每次绘制弄一层。
直接把层删掉就可以了。
也就是把要绘制的层从你的绘制集合删除。
[/Quote]
足球中国 2009-11-20
  • 打赏
  • 举报
回复
每次绘制弄一层。
直接把层删掉就可以了。
也就是把要绘制的层从你的绘制集合删除。
卡卡Gemini 2009-11-20
  • 打赏
  • 举报
回复
您的做法我明白了一点,判断点与线的距离,如果小于(比如5)个像素,就把线断掉,但是这样可能计算量会比较大,我本来的想法是将线作为对象,添加个事件,不知能不能做到???
[Quote=引用 3 楼 gomoku 的回复:]
点线距离:

其中
PointF p1:起始点
PointF p2:终点
C# codeprivatefloat GetDistanceToPoint(Point p)
{float normalX= p1.Y- p2.Y;float normalY= p2.X- p1.X;float normalLength= (float)Math.Sqrt(normalX* normalX+ normalY* normalY);if (normalLength<0.0001)return Math.Abs(p.X- p1.X)+ Math.Abs(p.Y- p1.Y);

normalX/= normalLength;
normalY/= normalLength;float distance= Math.Abs((p.X* normalX+ p.Y* normalY)- (p1.X* normalX+ p1.Y* normalY));return distance;
}
[/Quote]
lee_b 2009-11-20
  • 打赏
  • 举报
回复
LZ可以试试,在鼠标点击事件里面,,取到点击屏幕的坐标。。
判断该点是否在你画的线上。。然后再取消画的线就行了。。。
gomoku 2009-11-20
  • 打赏
  • 举报
回复
点线距离:

其中
PointF p1:起始点
PointF p2:终点

private float GetDistanceToPoint(Point p)
{
float normalX = p1.Y - p2.Y;
float normalY = p2.X - p1.X;
float normalLength = (float)Math.Sqrt(normalX * normalX + normalY * normalY);

if (normalLength < 0.0001) return Math.Abs(p.X - p1.X) + Math.Abs(p.Y - p1.Y);

normalX /= normalLength;
normalY /= normalLength;

float distance = Math.Abs((p.X * normalX + p.Y * normalY) - (p1.X * normalX + p1.Y * normalY));
return distance;
}
卡卡Gemini 2009-11-20
  • 打赏
  • 举报
回复
这个不太好判断啊,我把程序改了一下
class LinkLine
{


public /*static*/ Point Start;
public /*static*/ Point End;
public Graphics g;
public Pen pen;
public Pen DisPen;

public LinkLine(Pen pen,Pen DisPen,IntPtr hwnd)
{
this.pen = pen;
this.DisPen = DisPen;
g = Graphics.FromHwnd(hwnd);
}

public void Link()
{
g.DrawLine(pen, this.Start, this.End);
}

public void DisLink()
{
g.DrawLine(DisPen, this.Start, this.End);

}

public delegate void LineClickHandler(object sender, MouseEventArgs e);

public event LineClickHandler LineMouseClick;

public void OnLineMouseClick(object sender, MouseEventArgs e)
{
//判断下鼠标是否在线上
LineMouseClick(sender,e);
}
}

[Quote=引用 1 楼 gomoku 的回复:]
        publicstaticPoint Start;
        publicstaticPoint End;

你只能有一条连线吗?
   
取消连线的方法根画连线的方法是一样的。只是要判断点在哪一条连线上。
[/Quote]
gomoku 2009-11-20
  • 打赏
  • 举报
回复
public static Point Start;
public static Point End;

你只能有一条连线吗?

取消连线的方法根画连线的方法是一样的。只是要判断点在哪一条连线上。
特别 2009-11-20
  • 打赏
  • 举报
回复
楼主可以参考 DrawTools

完全满足你的要求,还可以自己扩展
卡卡Gemini 2009-11-20
  • 打赏
  • 举报
回复
我改进了方法,把画线的方法实际上做成了一个自定义控件,相当于一个按钮,这样的话直接删除按钮就可以了。目前已经实现了,具体实际应用中可能还需要改一改

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧