返回首页

简介
这是我在我的业余时间开发的绘图工具,它可以绘制矩形,圆和其他形状,您还可以移动,调整大小,甚至一些旋转的形状。这将是一个有用的出发点复杂的图形项目。背景
要充分认识这段代码中,用户了解一些C#的概念,反思,接口,继承等,这个绘图工具还有另一个版本使用WPF,您可以找到{A}。使用代码
该项目首先创建一个工具箱,其中包含所有可用的绘图工具。像下面的屏幕截图:
{S0}
,然后用户可以选择这些工具来绘制主屏幕上,屏幕捕获类似于以下内容:
{S1}
这个项目还附带了一个用户的PropertyBag,动态地改变形状边框的颜色,填充颜色,箭头宽度,文本框的内容,文字的大小,等
{S2}
这个项目终于提供了一个导出为XML文件或JPG文件的绘图选项的用户。
上面的XML文件,该项目可以打开此文件的下一次,用户可以编辑自己的图纸。
完成后,用户可以选择将其导出为JPG文件。
以下是该项目的解释。
我已经定义了几个基本的形状,LeShape是基础类,以序列化我所创建的形状,我已经重新定义LeColor结构,像下面:
{C}
我们不能序列化C#中的字体和颜色类XML,我创造了他们相当于结构,并用他们无处不在。
这个绘图工具的基本类LeShape:

    public abstract class LeShape : IShape

    {

        private bool showBorder = true;

        public bool ShowBorder

        {

            get { return showBorder; }

            set

            {

                showBorder = value;

                LeCanvas.self.Canvas.Invalidate();

            }

        }

        private LeColor borderColor = new LeColor(Color.Black);

        public LeColor LeBorderColor

        {

            get { return borderColor; }

            set

            {

                borderColor = value;

                LeCanvas.self.Canvas.Invalidate();

            }

        }



        [XmlIgnore]

        public Color BorderColor

        {

            get { return LeBorderColor.ToColor(); }

            set { LeBorderColor = new LeColor(value); }



        }

        private int borderWidth = 1;

        public int BorderWidth

        {

            get { return borderWidth; }

            set

            {

                borderWidth = value;

                LeCanvas.self.Canvas.Invalidate();

            }

        }



        private Rectangle bounds;

        [XmlIgnore]

        public Rectangle Boundary

        {

            set { bounds = value; 

            Rect =new LeRect(value); 

            }

            get { return bounds; }

        }



...

        public LeShape()

        {

            path = new GraphicsPath();

            objectsInPath = new ArrayList();

        }

正如你可以看到,这LeShape类是抽象类,因为我们不希望用户在任何时候实例。相反,我们创建ZoneShape,矩形,基于此LeShape类,然后我们实例化,它更有意义。
为了让用户移动,调整大小形状,我做了另一个类BoundaryShape,它继承自LeShape,其中包含的所有属性,而这BoundaryShape仅处理用户的鼠标移动,它不会被序列化到XML文件。
基本上所有的形状将继承BoundaryShape,并BoundaryShape从LeShape继承。
public class RoundRectShape : BoundaryShape



{

        private int radius = 10; 

我们可以有圆角半径的形状,默认情况下,半径为10像素。
我们使用下面的paint方法,得出这样的垄断的矩形形状。
    public override void Paint(object sender, Graphics g)

        {

            Point[] pt = new Point[8];

 

            path = new GraphicsPath();



          path.AddLine(pt[4], pt[5]);

            path.AddArc(new Rectangle(pt[6], new Size(radius, radius)),

                90, 90);

            path.AddLine(pt[6], pt[7]);



            if (path != null)

            {

                g.FillPath(new System.Drawing.Drawing2D.LinearGradientBrush(

                    Boundary, FromColor, ToColor, LightAngle), path);

            }

        }

这个paint方法在BoundaryShape副本,我们不想使用它,因此我们把它作为改性剂覆盖。
,您还将看到LeShape实施IShape接口。
我LeShape IShape实施虚拟方法。然后在其继承的类,有选择性地重写这些虚方法。
ZoneShape有一个文本字段,这个想法是ZoneShape动作,文本字段以及移动。这是当用户完成移动zoneshape,然后引发事件BoundaryShape,ZoneShape接受这个事件,然后处理此事件,将文本字段参数。
用户的鼠标移动LeCanvas类处理,LeCanvas类,那么这个事件传递到所有屏幕上的形状。每个形状,然后决定自己的行动。无论它的绘图开始,或移动形状或调整形状的大小。尾注
我想计算机的世界里,我总是喜欢学习他人的,或者为他人,也许觉得我的工作是有用的贡献。

回答

评论会员:vahid_m_2008 时间:2012/02/03
我如何使用超过一个PictureBox本章程以某种形式在同一时间
评论会员:?vahid_m_2008 时间:2012/02/03
你需要有2个控制器,2画布,我建议
评论会员:。ferfr 时间:2012/02/03
!我有2个控制器和2帆布,但因为静态成员,它不能正常工作

 

        LeCanvas  curCanvas;

        LeCanvas curCanvas2;

       

        public Form1()

        {

            InitializeComponent();

            curCanvas = new LeCanvas(pictureBox1);

            curCanvas2 = new LeCanvas(pictureBox2);

           

        }

 

public static LeCanvas self;

在这样的形状画在过去的PictureBox
评论会员:。vahid_m_2008 时间:2012/02/03
嘿,

我见过你的工作,我认为是伟大的,我试图在我校项目使用一些你的结构,我米很短的时间(4天),我想知道我怎么能旋转形状,我看不到一个funtion或财产,要做到这一点,请帮我!是我唯一需要请感谢
评论会员:游客 时间:2012/02/03
|SubsonicDesignOfficial:我想设置所选工具的源代码
Southmountain
评论会员:游客 时间:2012/02/03
恐怕您已经阅读源代码。结构良好的源代码,你将能够使用它
。pcm_it
评论会员:游客 时间:2012/02/03
绘图团结抗锯齿受益。基本上是一个很好的文章,但我希望看到更多的细节和解释的代码。上周六,6月25日,201111:36修改