using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Windows.Input;
|
using System.Windows.Media;
|
using System.Windows;
|
|
|
namespace XHandler.Controls.DrawCanvas
|
{
|
/// <summary>
|
/// 画图几何图形基类
|
/// </summary>
|
public abstract class DrawGeometryBase : DrawingVisual, IDrawTool
|
{
|
public int ID = 1;
|
|
public DrawGeometryBase(DrawingCanvas drawingCanvas)
|
{
|
this.DrawingCanvas = drawingCanvas;
|
this.ID = DrawingCanvas.ID;
|
}
|
|
#region 鼠标键盘事件
|
|
public virtual Boolean OnKeyDown(Key key) => false;
|
|
public virtual Boolean OnKeyUp(Key key) => false;
|
|
public virtual Boolean OnTouchDown(Int32 touchId, Point point) => false;
|
|
public virtual Boolean OnTouchEnter(Point point) => false;
|
|
public virtual Boolean OnTouchLeave(Point point) => false;
|
|
public virtual Boolean OnTouchMove(Point point) => false;
|
|
public virtual Boolean OnTouchUp(Point point) => false;
|
|
#endregion
|
|
#region 绘图事件
|
|
public virtual void Draw()
|
{
|
var dc = this.RenderOpen();
|
dc.DrawGeometry(new SolidColorBrush(Color.FromArgb(0x20, 0x00, 0x00, 0x00)), pen, geometry);
|
//dc.DrawGeometry(new SolidColorBrush(Color.FromArgb(0, 162, 232, 0)), pen, geometry);
|
//dc
|
dc.Close();
|
}
|
|
public virtual Boolean Erase(Geometry erase)
|
{
|
geometry = Geometry.Combine(geometry, erase, GeometryCombineMode.Exclude, null);
|
|
if (geometry.IsEmpty())
|
return true;
|
|
Draw();
|
|
return false;
|
}
|
|
public virtual Boolean Select(Point point)
|
{
|
return geometry.FillContains(point);
|
}
|
|
public virtual Boolean Select(Geometry select)
|
{
|
return !Geometry.Combine(geometry, select, GeometryCombineMode.Intersect, null).IsEmpty();
|
}
|
|
public virtual Rect Selected()
|
{
|
if (Mode == 1)
|
return selectRect;
|
|
Mode = 1;
|
|
var dc = this.RenderOpen();
|
|
dc.DrawGeometry(pen.Brush, null, geometry);
|
|
selectRect = GetRenderBounds();
|
|
dc.DrawRectangle(Brushes.Transparent, this.DrawingCanvas.SelectBackgroundPen, selectRect);
|
dc.DrawRectangle(null, this.DrawingCanvas.SelectPen, selectRect);
|
|
dc.Close();
|
|
return selectRect;
|
}
|
|
public virtual void Unselected()
|
{
|
if (Mode == 0)
|
return;
|
|
Mode = 0;
|
|
Draw();
|
}
|
|
protected virtual Rect GetRenderBounds()
|
{
|
return geometry.GetRenderBounds(this.DrawingCanvas.SelectPen);
|
}
|
|
public virtual void Move(Double dx, Double dy)
|
{
|
if (geometry.Transform == null)
|
geometry.Transform = new TranslateTransform(dx, dy);
|
else
|
{
|
var translate = (TranslateTransform)geometry.Transform;
|
translate.X += dx;
|
translate.Y += dy;
|
}
|
|
if (Mode == 1)
|
{
|
Mode = 0;
|
Selected();
|
}
|
else
|
Draw();
|
}
|
|
public virtual void Edit() { }
|
|
#endregion
|
|
#region 序列化
|
|
public virtual DrawGeometrySerializerBase ToSerializer() => null;
|
|
public virtual void DeserializeFrom(DrawGeometrySerializerBase serializer) { }
|
|
#endregion
|
|
#region 属性
|
|
public Int32 TouchId { get; protected set; }
|
|
public Boolean CanTouchEnter { get; protected set; }
|
|
public Boolean CanTouchLeave { get; protected set; }
|
|
public Boolean CanTouchDown { get; protected set; }
|
|
public Boolean CanTouchMove { get; protected set; }
|
|
public Boolean CanTouchUp { get; protected set; }
|
|
public Boolean CanKeyDown { get; protected set; }
|
|
public Boolean CanKeyUp { get; protected set; }
|
|
public Boolean IsFinish { get; protected set; }
|
|
public DrawToolType DrawingToolType { get; protected set; }
|
|
public Boolean CanEdit { get; protected set; }
|
|
public Int32 Mode { get; protected set; }
|
|
#endregion
|
|
#region 字段
|
|
public DrawingCanvas DrawingCanvas;
|
protected Geometry geometry;
|
protected PathGeometry pathGeometry => (PathGeometry)geometry;
|
protected Pen pen;
|
protected Rect selectRect;
|
|
#endregion
|
}
|
}
|