65.9K
CodeProject 正在变化。 阅读更多。
Home

对称绘图工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (27投票s)

2004年6月1日

CPOL

3分钟阅读

viewsIcon

85119

downloadIcon

1705

本文档描述了 Symmetry Drawing Tool 的开发和使用。

Example Drawing

引言

此程序是 .NET Compact Framework 竞赛的参赛作品。

请试用并投票支持我的文章。

应用程序用户界面

这款应用程序是一种创建独特图画的有趣方式。本节介绍该应用程序及其使用方法。

SymmetricDrawCE.exe 应用程序可在支持 .NET 的 PDA 和桌面计算机上运行。两种情况下的应用程序宽度和高度均为 240x320。

SymmetricDraw.exe 应用程序仅在 Windows.NET 上运行。

这两个应用程序是相同的,除了在 Windows.NET 版本中可以旋转位图和文本。

菜单图标

示例图片 - 最大宽度为 600 像素 打开 - 选择要加载为背景的位图文件
示例图片 - 最大宽度为 600 像素 保存 - 保存绘图。
示例图片 - 最大宽度为 600 像素 - 打开一个编辑框,您可以更改对称轴的数量
示例图片 - 最大宽度为 600 像素 形状 - 从弹出菜单中选择绘图形状。可用形状为直线、圆弧、曲线、文本和位图。
示例图片 - 最大宽度为 600 像素 镜像 - 切换绕每条轴的镜像。
示例图片 - 最大宽度为 600 像素 填充 - 绘制填充的曲线。
示例图片 - 最大宽度为 600 像素 颜色 - 允许您更改线条或文本的颜色。
示例图片 - 最大宽度为 600 像素 印章 - 将当前线条或文本复制到背景。请注意,在 Windows.NET 版本中,您可以使用 ALT 键作为此按钮的快捷方式。
示例图片 - 最大宽度为 600 像素 清除 - 擦除背景。

直线和圆弧形状控件

接下来的两张图片展示了应用程序中直线和圆弧的示例。用户已放置了一个填充的蓝色曲线,并正在处理一个 4 点未闭合的绿色曲线。

旁边的图片显示了用于操作曲线的控件。有四个红色的圆圈,它们定义了贝塞尔曲线的控制点。

形状中间的红色正方形用于移动形状。连接到中心正方形的圆圈用于旋转所有控制点。

轴也有控件。所有轴中心的灰色正方形允许您平移整个轴和控制点。其中一个轴末端的圆形控件允许您围绕中心正方形旋转所有内容。

Example Drawing Inset

位图和文本形状控件

下面的示例展示了文本和位图的使用方法。您可以使用控件来定位文本。注意:在 Windows.NET 版本中,您还可以旋转文本和位图。

Example Drawing Example Drawing

源代码注意事项

两个项目 - 本文包含两个项目:SymmetricDraw 和 SymmetricDrawCE。我最初只有一个项目,但常规 .NET 和 .NET CF 的资源文件不同,所以我不得不将它们分开。

因此,请记住为正确的平台加载正确的项目。

双缓冲 - 两个项目都使用双缓冲,但实现方式不同。在 Windows.NET 中,我使用了内置的双缓冲。

在 .NET CF 上,我必须接管绘图才能实现双缓冲。这是执行此操作的例程。.NET Compact Framework 不支持贝塞尔曲线。所以我找到了一个 Java 实现并将其转换为 C#。要创建用于旋转形状的控件,我在控件内部使用一个点数组。然后,当用户移动鼠标时,这些点会围绕一个定义的中心点旋转。

private void ReDraw()
{
    Graphics g = CreateGraphics();

    // Define Graphics object for buffer
    Graphics bufferedGraphics = Graphics.FromImage(bufferBitmap);

    bufferedGraphics.DrawImage(bmpBack, 0, 0);
    symTool.DrawSymShapes(bufferedGraphics);
    symTool.DrawGuides(bufferedGraphics);
    g.DrawImage(bufferBitmap,0,0);

    g.Dispose();
    bufferedGraphics.Dispose();
}

贝塞尔曲线 -

class curve
{
    public addCurve(ref Point[] pnts, Point p0, Point p1, Point p2, Point p3)
      //Adds a Bezier curve to the given array of points 
      //using the given control points.
    public draw(ref Graphics drawingSurface, ref Pen pen, 
                ref SolidBrush brush, ref Point[] pnts, bool bFilled)
     //Draws the curve on the surface. Can be filled or open curve.
}

旋转形状 -

class SymmetryTool
{
    SetPos()
        //Sets the X,Y position of a single point.
    SetCenter()
        //Sets the rotational center for this point.
    CalcAngle()
        //Calculates the angle of this point for its center point.
    CalcRad()
        //Calculates the radius from this point to the center point.
    ClickOn()
        //Finds the point that is Clicked on.  
        //Or return -1 for none selected.
    DrawGuides()
        //Draw the control guides on the Graphics surface.
    DrawSymShapes()
        //Draw the shapes on the Graphics surface.
}

保存位图 - 两个版本都可以加载和保存位图。但 .NET CF 没有内置的保存位图功能,所以我必须使用自定义代码。我找到的唯一保存位图的代码非常慢。它的工作方式是遍历位图的每个像素。任何必须单独处理每个像素的例程都会很慢。我读到 .NET CF 的下一个版本将包含一个位图保存例程。

历史

  • 2004/5/28 - 初始版本。
© . All rights reserved.