(二十五)绘制模块的业务逻辑实现(一)
分析
工具栏

复选框所对应的实体(实现<-鼠标操作类型提供者IMouseOperationProvider)
⬇
鼠标操作类型枚举MouseOperationType(方圆线等),鼠标操作模式变化的观察者
单选框所对应的实体DrawToolModel(实现<-绘图操作提供一个绘图方法IDrawProvider),这个其实是画图时需要的参数
⬇
包括笔的粗细枚举实现,颜色枚举实现,还包含绘制好的实体集合,实现draw方法
绘制的元素--就是矩形,圆圈等等图像实体

图像
要把画的图像实体显示在图片上,得到的效果如下:

显示在页面的实体是


上面复选框实体MouseOperationProvider的观察者观察的是选中的鼠标操作类型,然后image的vm中订阅他的变化


在image模块的图像上的操作是:
点击鼠标左键画图---->涉及多种鼠标操作所以创建一个类,以单例模式注册到IOC


其中鼠标操作基类
包括几个虚方法和抽象方法

属性包含:

具体实现在子类DrawMouseOperation中,其中的绘图操作需要一个BitmapSourceDrawProvider( BitmapSource的绘制提供者)

BitmapSourceGDI中的create方法返回一个BitmapSourceDrawProvider

然后鼠标操作的实现
/// <summary>
/// 鼠标按下并移动=绘图
/// </summary>
/// <param name="point"></param>
/// <param name="cursor"></param>
public override void MouseLeftButtonDownAndMove(Point point, ref System.Windows.Input.Cursor cursor)
{
using (BitmapSourceDrawProvider provider = PreviewBitmap.Create(System.Drawing.Color.Transparent))
{
System.Drawing.Pen pen = new System.Drawing.Pen(DrawToolModel.PenColorType.GetBrush(), DrawToolModel.PenWidthType.GetWidth());
Rect viewRect = new Rect(MouseDownPoint, point);//带F的时winform架构下的数据结构
switch (MouseOperationType)
{
case MouseOperationType.DrawRectangle:
provider.Graphics.DrawRectangles(pen, new System.Drawing.RectangleF[] { viewRect.ToRectangleF() });
cursor = System.Windows.Input.Cursors.Cross;
break;
case MouseOperationType.DrawEllipse:
provider.Graphics.DrawEllipse(pen, viewRect.ToRectangleF());
break;
case MouseOperationType.DrawArrow:
provider.Graphics.DrawLine(pen, MouseDownPoint.ToDrawingPointF(), point.ToDrawingPointF());
break;
case MouseOperationType.DrawPen:
_points.Add(point);
for (int i = 0; i < _points.Count - 1; i++)
{
provider.Graphics.DrawLine(pen, _points[i].ToDrawingPointF(), _points[i + 1].ToDrawingPointF());
}
cursor = System.Windows.Input.Cursors.Pen; //是WPF的鼠标,
break;
case MouseOperationType.DrawText:
break;
case MouseOperationType.DrawSelect:
break;
}
}
}
/// <summary>
/// 鼠标左键弹起
/// </summary>
/// <param name="point"></param>
public override void MouseLeftButtonUp(Point point)
{
Rect viewRect = new Rect(MouseDownPoint, point);
Rect srcRect = viewRect;
DrawElementBase drawElement = null;
switch (MouseOperationType)
{
case MouseOperationType.DrawRectangle:
if (viewRect.Width > 0 && viewRect.Height > 0)
{
drawElement = new DrawRectangleElement(srcRect, DrawToolModel.PenWidthType, DrawToolModel.PenColorType);
}
break;
case MouseOperationType.DrawEllipse:
if (viewRect.Width > 0 && viewRect.Height > 0)
{
drawElement = new DrawEllipseElement(srcRect, DrawToolModel.PenWidthType, DrawToolModel.PenColorType);
}
break;
case MouseOperationType.DrawArrow:
if (viewRect.Width > 0 && viewRect.Height > 0)
{
drawElement = new DrawArrowElement(MouseDownPoint, point, DrawToolModel.PenWidthType, DrawToolModel.PenColorType);
}
break;
case MouseOperationType.DrawPen:
if (_points.Count > 2)
{
drawElement = new DrawPenElement(_points.DeepClone(), DrawToolModel.PenWidthType, DrawToolModel.PenColorType);
}
break;
case MouseOperationType.DrawText:
break;
case MouseOperationType.DrawSelect:
break;
}
if (drawElement != null)
{
DrawToolModel.DrawElements.Add(drawElement);
}
//每次预览图层画完后要清空,因为在实际画多个元素的图层里,会把所有元素重新绘制一遍
PreviewBitmap.Clear(System.Drawing.Color.Transparent);
}
public override void MouseMove(Point point, ref System.Windows.Input.Cursor cursor)
{
if (MouseOperationType == MouseOperationType.DrawText)
{
return;
}
switch (MouseOperationType)
{
case MouseOperationType.DrawEllipse:
break;
case MouseOperationType.DrawArrow:
break;
case MouseOperationType.DrawRectangle:
cursor = System.Windows.Input.Cursors.Cross;
break;
case MouseOperationType.DrawPen:
cursor = System.Windows.Input.Cursors.Pen; //是WPF的鼠标,
break;
default: break;
}
}
在image的vm中只需要调用鼠标操作业务实体的方法即可

生成鼠标操作模型的工厂(基接口)

创建鼠标操作实体

bitmap的传递
先在image的vm中调用初始化

然后用工厂模式创建绘图实体时传入

而这个方法返回的是一个鼠标操作实体
然后绑定前端的鼠标操作业务实体执行一个更新操作



浙公网安备 33010602011771号