(二十五)绘制模块的业务逻辑实现(一)

分析

工具栏

image
复选框所对应的实体(实现<-鼠标操作类型提供者IMouseOperationProvider)

鼠标操作类型枚举MouseOperationType(方圆线等),鼠标操作模式变化的观察者

单选框所对应的实体DrawToolModel(实现<-绘图操作提供一个绘图方法IDrawProvider),这个其实是画图时需要的参数

包括笔的粗细枚举实现,颜色枚举实现,还包含绘制好的实体集合,实现draw方法

绘制的元素--就是矩形,圆圈等等图像实体
image

图像

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

显示在页面的实体是
image
image

上面复选框实体MouseOperationProvider的观察者观察的是选中的鼠标操作类型,然后image的vm中订阅他的变化
image
image
在image模块的图像上的操作是:
点击鼠标左键画图---->涉及多种鼠标操作所以创建一个类,以单例模式注册到IOC
image
image

其中鼠标操作基类
包括几个虚方法和抽象方法
image
属性包含:
image

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

然后鼠标操作的实现


        /// <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中只需要调用鼠标操作业务实体的方法即可
image

生成鼠标操作模型的工厂(基接口)
image
创建鼠标操作实体
image

bitmap的传递
先在image的vm中调用初始化
image
然后用工厂模式创建绘图实体时传入
image
而这个方法返回的是一个鼠标操作实体
然后绑定前端的鼠标操作业务实体执行一个更新操作
image

posted @ 2024-02-29 14:26  huihui不会写代码  阅读(40)  评论(0)    收藏  举报