绘图库






4.78/5 (61投票s)
用于创建形状和开发工具的库。

引言
这是一个用于绘图的通用库(正在开发中)。它由一些基本工具和形状组成。它允许您绘制您想要创建的形状,并开发用于管理图形的工具。
使用代码
这段代码描述了从 Shape 派生的类和从 Tool 派生的类的实现。
public class Ellipse : Shape
{
    public Ellipse()
    {
        Geometric.AddEllipse(new System.Drawing.Rectangle(0, 0, 1, 1));
    }
    public Ellipse(Ellipse ellipse) : base(ellipse)
    {
    }
    public override object Clone()
    {
        return new Ellipse(this);
    }
}
// ....
public class Select : Tool    
{
    .....
    // Override IActions Interface functions
    public override void MouseDown(IDocument document, MouseEventArgs e)
    {
        base.MouseDown(document, e);
        if (SelectShape(document.Shapes, e.Location) == HitPositions.None)
            Select.UnselectAll(document.Shapes);
        if (SelectedShapes != null)
            SelectedShapes(this, Select.GetSelectedShapes(document.Shapes));
    }
    public override void MouseUp(IDocument document, MouseEventArgs e)
    {
        base.MouseUp(document, e);
        document.ActiveCursor = Cursors.Default;
    }
    
    .....
}
对于每个新形状,实现复制构造函数和函数 Clone 非常重要,而在实现新工具时重写 IActions 接口很方便。
主要方案
在文档中,有这些方案
- 橙色表示热点类(通常是接口或抽象类)。
- 黄色表示活动类。
- 蓝色表示被动类(通常是数据容器或结构体)。
- 浅灰色表示框架中的类,但在当前方案中不重要。
- 深灰色表示框架外部的类。
此方案表示实际的形状层次结构

此方案表示实际的工具层次结构

此方案表示绘图面板、工具和形状之间的通信通道

IActions 接口包含工具使用的所有面板操作;例如,鼠标按下和鼠标移动,以及绘制函数。IDocument 是一个接口,但它是蓝色的,因为它只是工具和形状之间的连接点,因此它是一个被动类。
以下方案表示转换器和形状之间的关系。转换器用于处理形状移动,因此如果您想添加任何新的移动,您只需派生两个类,Transformer 和 CompositeTransformer,而不是形状层次结构中的所有类。

此方案表示实际的外观层次结构

文档中还提供其他方案。
关注点
要旋转形状,请选择旋转工具并选择形状。鼠标点击并移动。要相对于非中心点旋转,请选择一个形状,单击 Ctrl 键,鼠标点击并移动。

要变形形状,将属性 Marked 更改为 true,然后选择变形工具,在标记上单击鼠标,并移动。尝试组合形状并执行上述相同操作。

序列化
序列化操作由 XmlSerializer 完成。性能不是很好。
更新
- 缩放功能。
- 面板上的网格。
- DrawFreeLine 工具,可以决定两个连续点之间的最小偏移量。

请参阅“布局”选项,了解“置于顶层”和“置于底层”功能。
最近更新
增加了使用箭头和 Control 键移动形状的可能性。
Bug 修复
修改了 Text 形状的 setter 方法,以在旋转后保持文本状态。
已知错误
- 变形工具在形状边界标记上不精确。
- 调整大小工具和启用网格的问题。
- 撤销-重做机制不精确。
未来发展
- 改进工具(例如,调整大小)。
- 提高性能。
- 开发其他工具。
参考文献
对于文档
有关面向对象和色彩理论以及其他软件开发信息


