绘制节点手柄:
Rectangle getHandle(Point p) { Rectangle rect = new Rectangle( p.X - 3, p.Y - 3, 6, 6); return rect; }
判断某点是否位于手柄区域:
bool isHandle(Point p) { foreach (Point pt in points) { if (isInside(p, getHandle(pt))) { downIndex = points.IndexOf(pt); downPoint = pt; current = pt; return true; } } return false; }
注意这个部分可以适当放大一下判断区域,这样便于鼠标操作(手柄太小,不易点击)。
绘制手柄:
void drawHandle(Graphics g, Point p) { if (points.IndexOf(p) == downIndex) g.FillRectangle( Brushes.Black, getHandle(p)); else g.DrawRectangle( Pens.Black, getHandle(p)); }
绘制曲线:
void drawCurve(Graphics g) { g.DrawCurve(Pens.Black, points.ToArray()); }
曲线绘制采用了Graphics类的基数样条绘制方法,默认张力0.5。
绘制十字定位线(辅助功能):
void drawCrosshair(Graphics g, Point p) { g.DrawLine( Pens.Gray, 0, p.Y, clientRect.Width, p.Y); g.DrawLine( Pens.Gray, p.X, 0, p.X, clientRect.Height); }
鼠标拖动:
protected override void OnMouseMove(MouseEventArgs e) { mousePoint = e.Location; if (mouseDown) { if (Current != null) { Current = mousePoint; } Refresh(); } }
更多带节点曲线,鼠标可拖动节点调整曲线,类似Photoshop相关文章请关注PHP中文网!
查看更多关于带节点曲线,鼠标可拖动节点调整曲线,类似Photoshop的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did74648