南昌航空大学科技学院学士学位论文
public override void Draw(Graphics g) {
Point[] pts = new Point[pointList.Count]; pointList.CopyTo(pts);
Pen pen = new Pen(penColor, penWidth); g.SmoothingMode = SmoothingMode.AntiAlias; AdjustableArrowCap myArrow = new AdjustableArrowCap(4, 4, true); pen.CustomEndCap = myArrow; if (pts.Length < 3) {
if (pts.Length > 1) {
g.DrawLine(pen, pts[0], pts[1]); } } else {
g.DrawCurve(pen, pts); }
pen.Dispose(); } } }
(2)在解决方案管理器中添加一个名为ToolCurve.cs的类,使其从ToolObjiect类派生。主要代码如下;
class ToolCurve : ToolObject {
private int minDistance = 20; private Point myLastPoint;
public override void OnMouseDown(Palette palette, MouseEventArgs e) {
base.OnMouseDown(palette, e); CC.isToolPoint = false;
Point p = new Point(e.X, e.Y);
DrawMyCurve w = new DrawMyCurve(p, Color.Red, 2, CC.ID); AddNewObject(palette, w); myLastPoint = p;
isNewObjectAdded = true; }
public override void OnMouseMove(Palette palette, MouseEventArgs e) {
if (isNewObjectAdded == false)
21
南昌航空大学科技学院学士学位论文
{
return; }
Point point = new Point(e.X, e.Y);
int index = CC.myService.FindObjectIndex(CC.ID);
DrawMyCurve w = (DrawMyCurve)palette.graphics[index]; if (e.Button == MouseButtons.Left) {
int dx = myLastPoint.X - point.X; int dy = myLastPoint.Y - point.Y;
int distance = (int)Math.Sqrt(dx * dx + dy * dy); if (distance < minDistance) {
if (w.PointList.Count > 1) {
w.MoveHandleTo(point, w.HandleCount); } } else {
w.AddPoint(point); myLastPoint = point; } }
palette.Refresh(); }
在ToolCurve.cs的类中,当用户按下鼠标左键时,即可触发OnMouseDown事件,在该事件中,捕获鼠标所在的点,并以此点为曲线的终点myLastPoint,同时创建曲线对象w。
(3)在主窗体的构造函数内添加代码;
tools[(int)ToolType.Curve] = new ToolCurve();
(4)在主窗体上双击曲线按钮,在对应的Click事件中添加如下代码; ActiveTool = Palette.ToolType.Curve; (5)运行程序,观察运行结果 如图所示;
22
南昌航空大学科技学院学士学位论文
图3.4曲线的绘制
这里说明下,这是DrawMyCurve从TrackCurve继承表示绘制的是带有箭头的曲线。
3.2.3直线的绘制
(1) 运行以及基本构思还是和前面讲的矩形,曲线是如出一辙的。还有直线的
绘制DrawMyLine是从 TrackCurve继承的。
(2) 在解决方案管理器中添加一个名为ToolLine.cs的类,使其从ToolObjiect类派
生。主要代码如下;
class ToolLine : ToolObject
{
private int minDistance = 20; // private Point myLastPoint; private Point myFirstPoint; private Point myFirstPoint1;
public override void OnMouseDown(Palette palette, MouseEventArgs e) {
base.OnMouseDown(palette, e); CC.isToolPoint = false;
Point p = new Point(e.X, e.Y);
// DrawMyLine w = new DrawMyLine(p, Color.Red, 2, CC.ID); //AddNewObject(palette, w);
23
南昌航空大学科技学院学士学位论文
myFirstPoint = myFirstPoint1 = p; isNewObjectAdded = true; }
public override void OnMouseMove(Palette palette, MouseEventArgs e) {
if (isNewObjectAdded == false) {
return; }
Point point = new Point(e.X, e.Y);
int index = CC.myService.FindObjectIndex(CC.ID); DrawMyLine w = (DrawMyLine)palette.graphics[index]; if (e.Button == MouseButtons.Left) {
int dx = myFirstPoint1.X - point.X; int dy = myFirstPoint1.Y - point.Y;
int distance = (int)Math.Sqrt(dx * dx + dy * dy); if (distance < minDistance) {
if (w.PointList.Count >1) {
w.MoveHandleTo(point, w.HandleCount); } } else {
w.AddPoint(point);//这里有问题 myFirstPoint1 = point; } }
palette.Refresh(); }
(3)在主窗体的构造函数内添加代码;
tools[(int)ToolType.Line] = new ToolLine();
(4)在主窗体上双击曲线按钮,在对应的Click事件中添加如下代码; ActiveTool = Palette.ToolType.Line;
(5)运行程序,观察运行结果 如图所示;
24
南昌航空大学科技学院学士学位论文
图3.5直线的绘制
3.2.4文字的绘制
(1).这是在解决方案源管理中,添加一个名为DrawTexe.cs的类,使其从DrawObject类中派生,该类Draw方法的实现代码如下;
public override void Draw(Graphics g) {
Brush b = new SolidBrush(penColor); if (this.font != null) {
this.font.Dispose(); }
this.font = new Font(\宋体\, fontHeight, FontStyle.Regular, GraphicsUnit.Pixel);
Matrix matrix = new Matrix();
matrix.RotateAt(angle, startPoint); g.Transform = matrix;
g.DrawString(text, font, b, startPoint); g.ResetTransform(); matrix.Dispose(); b.Dispose();
25