对称绘图工具
本文档描述了 Symmetry Drawing Tool 的开发和使用。
引言
此程序是 .NET Compact Framework 竞赛的参赛作品。
请试用并投票支持我的文章。
应用程序用户界面
这款应用程序是一种创建独特图画的有趣方式。本节介绍该应用程序及其使用方法。
SymmetricDrawCE.exe 应用程序可在支持 .NET 的 PDA 和桌面计算机上运行。两种情况下的应用程序宽度和高度均为 240x320。
SymmetricDraw.exe 应用程序仅在 Windows.NET 上运行。
这两个应用程序是相同的,除了在 Windows.NET 版本中可以旋转位图和文本。
菜单图标
打开 - 选择要加载为背景的位图文件
保存 - 保存绘图。
轴 - 打开一个编辑框,您可以更改对称轴的数量
形状 - 从弹出菜单中选择绘图形状。可用形状为直线、圆弧、曲线、文本和位图。
镜像 - 切换绕每条轴的镜像。
填充 - 绘制填充的曲线。
颜色 - 允许您更改线条或文本的颜色。
印章 - 将当前线条或文本复制到背景。请注意,在 Windows.NET 版本中,您可以使用 ALT 键作为此按钮的快捷方式。
清除 - 擦除背景。
直线和圆弧形状控件
接下来的两张图片展示了应用程序中直线和圆弧的示例。用户已放置了一个填充的蓝色曲线,并正在处理一个 4 点未闭合的绿色曲线。
旁边的图片显示了用于操作曲线的控件。有四个红色的圆圈,它们定义了贝塞尔曲线的控制点。
形状中间的红色正方形用于移动形状。连接到中心正方形的圆圈用于旋转所有控制点。
轴也有控件。所有轴中心的灰色正方形允许您平移整个轴和控制点。其中一个轴末端的圆形控件允许您围绕中心正方形旋转所有内容。
位图和文本形状控件
下面的示例展示了文本和位图的使用方法。您可以使用控件来定位文本。注意:在 Windows.NET 版本中,您还可以旋转文本和位图。
源代码注意事项
两个项目 - 本文包含两个项目: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 - 初始版本。