C#绘图工具

目录

前言

一、整体思路

1、界面

2、功能

3、数据的传递

Tools和主窗体之间的数据传递:

Tools内部的数据传递:

二、具体实现

窗体功能代码

Form1.cs

SetSize.cs

Tool抽象类的设计

整体结构

Tool.cs

Tool具体实现类的设计

Pencil.cs

PatternTool.cs

PaintBuckt.cs

Line.cs

Word


前言

大一下学期学习了C#,由于课程设计需要,所以写了这个小程序,主要用到的由C#中的委托,VisualStuidio的WinForm编程。此程序实现了简单的画笔,油漆桶,文字,形状(矩形和椭圆)工具等功能以及对工具属性的设置。


一、整体思路

1、界面

软件的主要界面由VisualStuidio窗体设计器交互式生成。

2、功能

画图功能由一个抽象类 Tools 来实现,Tools下派生了 Pencil, Line, Pattern, PaintBucket, Word的具体的工具类。

画图功能的实现是在Tools类中定义抽象方法 MouseDownDraw(object sender ,MouseEventArgs e), MouseUpDraw(object sender ,MouseEventArgs e), MouseMoveDraw(object sender ,MouseEventArgs e), MouseClickDraw(object sender ,MouseEventArgs e) ,并根据选定的Tool动态的更改界面上PictureBox的的MouseDown,MouseUp,MouseMove,MouseClick事件。

3、数据的传递

Tools和主窗体之间的数据传递:

由于Tools需要操作主窗体中的PictureBox对象,所以需要Tool在构造时需要将PictureBox的相关的一些对象。

  • PictureBox pictureBox: 将主窗体的PictureBox对象传入Tool作为Tool的一个字段是为了在绘图完成后调用pictureBox.Image属性来更新屏幕上显示的内容。
  • Bitmap bitmap:获取绘图后的Bitmap并设置给pictureBox的Image。
  • Graphics g:保存bitmap对应的Graphic,用于调用绘图方法。

由于Tools具体的实现类所需的事件各不相同,所以我将具体的实现类所用到的事件保存在该具体实现类的一个字段中。

  • protected List<string> eventName;用于保存所用到的事件名称。
  • Dictionary<string, MouseEventHandler> eventMap;用于保存事件名称,和对应的EventHandler(object sender, EventArgs e)。

由于Tools实现类的的属性面板不同,所以每个实现类都有一个Panel panel字段来保存属性面板信息且必须实现抽象方法public abstract Panel GetAttrPanel();


Tools内部的数据传递:

由于在Tools.GetAttrPanel(),所有的控件没有保存在Tool的字段或属性中,所以控件虽然存在但是是不可访问的。而当更改一些该工具的一些属性(如颜色)时,一些控件需要做出相应的调整来和实际相匹配,所用我用一个字典 protected Dictionary<string, Control> attr 来保存控件对象,并在控件创建时(调用该 Tool 的 GetAttrPanel() 方法时)添加。下面为该方法的具体实现以及 attr 的具体引用。

  • 方法实现
        public override Panel GetAttrPanel()
        {
            if (panel != null) 
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel",panel);
            //color
            Label color = new Label();
            color.Text = "颜色";
            panel.Controls.Add(color);
            attr.Add("color", color);
            //select_color
            PictureBox select_color = new PictureBox();
            select_color.Width = 30;
            select_color.Height = 30;
            select_color.Visible = true;
            select_color.BackColor = Color.Black;
            select_color.MouseDoubleClick += new MouseEventHandler(this.SelectColor);
            panel.Controls.Add(select_color);
            attr.Add("select_color", select_color);
            //pixel
            Label pixel = new Label();
            pixel.Text = "粗细";
            panel.Controls.Add(pixel);
            attr.Add("pixel", pixel);
            //set_pixel
            NumericUpDown set_pixel = new NumericUpDown();
            set_pixel.Width = 50;
            set_pixel.Minimum = 1;
            set_pixel.ValueChanged += new EventHandler(this.SetWidth);
            set_pixel.ReadOnly = true;
            panel.Controls.Add(set_pixel);
            attr.Add("set_pixel", set_pixel);
            set_pixel.Value = 5;
            return panel;
        }
  • 具体引用
        //设置Pencil颜色
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor=colorDialog.Color;
                this.pen.Color=colorDialog.Color;
            }
        }
        //设置Pencil宽度
        private void SetWidth(object sender, EventArgs e)
        {
            NumericUpDown width = attr["set_pixel"] as NumericUpDown;
            pen.Width = (int)width.Value;
        }

二、具体实现

窗体功能代码

Form1.cs

在事件的操作上,在切换工具时,由于我没有移除原本Tool的EventHandler,所以后选择的Tool的EventHandler会覆盖先前的,再次切回原来的Tool,因为事件中已经有了这个Tool的所有EventHandler所以无法添加,就表现为只能显示出第二个选择的工具的绘图效果。所以我才在每个Tool中保存了对应的事件名称,和对应的EventHandler对象用于减去先选择的Tool的委托。

using palette.Tools;
using pallet.Tools.Word;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace palette
{
    public partial class Form1 : Form
    {
        private static Graphics g;//PictureBox的背景图片的Graphics
        private static Bitmap orignalBitmap = (Bitmap)Image.FromFile("o.jpg");//一个空白图片用于初始化画布
        private static List<Tool> Tools;//保存Tool的实例
        private Panel attr_panel;//属性面板
        private Tool SelectTool;//当前选择的工具
        public Form1()
        {
            Tools = new List<Tool>();
            InitializeComponent();
            //初始化画布
            Bitmap bmp = null;
            bmp = new Bitmap(orignalBitmap, this.pictureBox1.Width, this.pictureBox1.Height);
            this.pictureBox1.Image = bmp;
            //添加工具到ListView
            g = Graphics.FromImage(this.pictureBox1.Image);
            Tools.Add(new Pencil(g,this.pictureBox1));
            Tools.Add(new Line(g, this.pictureBox1));
            Tools.Add(new pallet.Tools.PatternTool(g, this.pictureBox1));
            Tools.Add(new PaintBucket(g,this.pictureBox1));
            Tools.Add(new Word(g,this.pictureBox1));
            foreach (Tool tool in Tools)
            {
                tool.Bitmap = bmp;
                this.ToolBox.Items.Add(tool);
            }
        }
        //工具选择
        private void ToolBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            //移除原有的属性栏和事件
            if (this.SelectTool != null)
            {
                this.MPanel.Controls.Remove(this.SelectTool.GetAttrPanel());
                this.ClearAllEvents(SelectTool);
            }
            //设置新的属性栏和事件
            Tool tool = this.ToolBox.SelectedItem as Tool;
            if (tool != null)
            {
                this.attr_panel=tool.GetAttrPanel();
                this.MPanel.Controls.Add(this.attr_panel);
                this.AddEventsToPBX(tool);
                SelectTool=tool;
            }
            this.UpdateSBar();
            this.UpdatePBxLocation();

        }
        //文件操作
        private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                ofd.Filter = "jpg文件|*.jpg|png文件|*.png|jpeg文件|*.jpeg|bmp文件|*bmp";
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    Bitmap bmp = new Bitmap(ofd.FileName);
                    this.pictureBox1.Image = bmp;
                    g =Graphics.FromImage(bmp);
                }
            }
        }
        private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog sfd = new SaveFileDialog())
            {
                sfd.Filter = "jpg文件|*.jpg|png文件|*.png|jpeg文件|*.jpeg|bmp文件|*bmp";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    this.pictureBox1.Image.Save(sfd.FileName);
                }
            }
        }
        //编辑菜单
        private void 设置画板大小ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("设置后会清空原图像,您确定继续吗?", "警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
            {
                using (SetSize ss = new SetSize(this.pictureBox1.Width,this.pictureBox1.Height))
                {
                    if (ss.ShowDialog() == DialogResult.OK)
                    {
                        this.pictureBox1.Width = ss.Width;
                        this.pictureBox1.Height = ss.Height;
                    }
                }
            }
        }

        #region 设置画板位置
        private void pictureBox1_SizeChanged(object sender, EventArgs e)
        {
            Bitmap bmp = null;
            bmp = new Bitmap(orignalBitmap, this.pictureBox1.Width, this.pictureBox1.Height);
            this.pictureBox1.Image = bmp;
            g = Graphics.FromImage(this.pictureBox1.Image);
            foreach(Tool tool in Tools)
            {
                if (tool != null)
                {
                    tool.Graphics = g;
                    tool.Bitmap = bmp;
                }
            }
            this.UpdateSBar();
        }
        //设置vsbar的值
        private void UpdateSBar()
        {
            int h;
            if (this.attr_panel is null)
                h = 0;
            else
                h = this.attr_panel.Height;
            int height = this.MPanel.Height - h;
            int width = this.MPanel.Width;
            this.vScrollBar1.Maximum=this.pictureBox1.Height-height;
            this.vScrollBar1.Minimum=0;
            this.vScrollBar1.Value=0;
            this.hScrollBar1.Maximum = this.pictureBox1.Width-width;
            this.hScrollBar1.Minimum = 0;
            this.hScrollBar1.Value = 0;
        }
        //调整picturebox的位置
        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            this.UpdatePBxLocation();
        }
        private void UpdatePBxLocation()
        {
            this.pictureBox1.Location = this.GetStartPointOfPicture();
        }
        //上下移动画板
        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            this.pictureBox1.Location=this.GetStartPointOfPicture();
        }
        private Point GetStartPointOfPicture()
        {
            Point p = new Point();
            int h;
            if (this.attr_panel is null)
                h = 0;
            else
                h = this.attr_panel.Height;
            p.Y= h;

            int offsetx = -this.hScrollBar1.Value;
            int offsety = -this.vScrollBar1.Value;
            p.X+=offsetx;
            p.Y+=offsety;
            return p;
        }
        #endregion


        //添加事件
        private void AddEventsToPBX(Tool tool)
        {
            Dictionary<string,MouseEventHandler> events =  tool.MouseHandller;
            List<string> eventname = tool.EventName;
            foreach(string en in eventname)
            {
                if (events.ContainsKey(en))
                {
                    switch (en)
                    {
                        case "MouseUp":this.pictureBox1.MouseUp += events[en]; break;
                        case "MouseDown": this.pictureBox1.MouseDown += events[en]; break;
                        case "MouseMove": this.pictureBox1.MouseMove += events[en]; break;
                        case "MouseClick": this.pictureBox1.MouseClick += events[en]; break;
                    }
                }
            }
        }
        //清除某个对象的特定事件
        private  void ClearAllEvents(Tool tool)
        {
            Dictionary<string, MouseEventHandler> events = tool.MouseHandller;
            List<string> eventname = tool.EventName;
            foreach (string en in eventname)
            {
                if (events.ContainsKey(en))
                {
                    switch (en)
                    {
                        case "MouseUp": this.pictureBox1.MouseUp -= events[en]; break;
                        case "MouseDown": this.pictureBox1.MouseDown -= events[en]; break;
                        case "MouseMove": this.pictureBox1.MouseMove -= events[en]; break;
                        case "MouseClick": this.pictureBox1.MouseClick -= events[en]; break;
                    }
                }
            }
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            this.UpdateSBar();
        }
    }
}

SetSize.cs

using System;
using System.Windows.Forms;

namespace palette
{
    public partial class SetSize : Form
    {

        public new int Width { get; private set; }
        public new int Height { get; private set; }
        public SetSize(int w,int h)
        {
            InitializeComponent();
            this.numericUpDown1.Value=w;
            this.numericUpDown2.Value=h;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            NumericUpDown numericUpDown = (NumericUpDown)sender; 
            if(numericUpDown.Tag.ToString()=="width")
                this.Width = (int)this.numericUpDown1.Value;
            else if(numericUpDown.Tag.ToString()=="height")
                this.Height = (int)this.numericUpDown1.Value;
        }
    }
}

Tool抽象类的设计

整体结构

SetWordDialog用于设置文字的字体;调用ShowDialog()时返回一个DialogResult枚举值,需要将一个按钮的DialogResult属性设置为DialogResult.OK;

Tool.cs

using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace palette
{
    internal abstract class Tool
    {
        protected string name;//工具名称
        protected string description;//工具描述
        protected PictureBox pictureBox;//主窗口的PictureBox
        protected Bitmap bitmap;//绘图操作的Bitmap
        protected ColorDialog colorDialog;
        protected Dictionary<string, Control> attr;
        protected Pen pen;
        protected Graphics g;
        protected List<string> eventName;
        protected Dictionary<string, MouseEventHandler> eventMap;

        public Bitmap Bitmap { get => this.bitmap; set => this.bitmap=value; }
        public Graphics Graphics { set => this.g = value; }
        public List<string> EventName {get => this.eventName;}
        public Dictionary<string, MouseEventHandler> MouseHandller { get => this.eventMap; }

        public Tool(PictureBox pbx)
        {
            this.pictureBox = pbx;
            this.SetEventName();
            this.SetEventMap();
        }
        public abstract Panel GetAttrPanel();
        public abstract void MouseDownDraw(object sender , MouseEventArgs e);
        public abstract void MouseUpDraw(object sender, MouseEventArgs e);
        public abstract void MouseClickDraw(object sender, MouseEventArgs e);
        public abstract void MouseMoveDraw(object sender, MouseEventArgs e);
        public override string ToString()
        {
            return name;
        }
        //设置所用到的事件名
        protected abstract void SetEventName();
        //将所用到的EventHandler和对应的事件用字典保存起来
        protected abstract void SetEventMap();
    }
}

Tool具体实现类的设计

Pencil.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace palette.Tools
{
    internal class Pencil : Tool
    {
        private bool draw;
        private PointF startP;
        private Panel panel;
        public Pencil(Graphics g,PictureBox pbx) : base(pbx)
        {
            this.g = g;
            name = "铅笔";
            description = "用于画图";
            attr = new Dictionary<string,Control>();
            colorDialog=new ColorDialog();
            pen = new Pen(Color.Black);
        }
        public override Panel GetAttrPanel()
        {
            if (panel != null) 
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel",panel);
            //color
            Label color = new Label();
            color.Text = "颜色";
            panel.Controls.Add(color);
            attr.Add("color", color);
            //select_color
            PictureBox select_color = new PictureBox();
            select_color.Width = 30;
            select_color.Height = 30;
            select_color.Visible = true;
            select_color.BackColor = Color.Black;
            select_color.MouseDoubleClick += new MouseEventHandler(this.SelectColor);
            panel.Controls.Add(select_color);
            attr.Add("select_color", select_color);
            //pixel
            Label pixel = new Label();
            pixel.Text = "粗细";
            panel.Controls.Add(pixel);
            attr.Add("pixel", pixel);
            //set_pixel
            NumericUpDown set_pixel = new NumericUpDown();
            set_pixel.Width = 50;
            set_pixel.Minimum = 1;
            set_pixel.ValueChanged += new EventHandler(this.SetWidth);
            set_pixel.ReadOnly = true;
            panel.Controls.Add(set_pixel);
            attr.Add("set_pixel", set_pixel);
            set_pixel.Value = 5;
            return panel;
        }
        public override void MouseClickDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }
        private void DrawLine(PointF EndPoint)
        {
            //g.DrawLine(pen, startP, EndPoint);
            this.g.DrawLine(pen, startP, EndPoint);
            this.pictureBox.Image = this.Bitmap;
        }
/*        private void FillCircle(Graphics g,PointF center)
        {
            float r = (float)width / 2;
            PointF location = new PointF(center.X-r,center.Y-r);
            RectangleF bound = new RectangleF();
            bound.X = location.X;
            bound.Y = location.Y;
            bound.Width = width;
            bound.Height = width;
            g.FillEllipse(brush,bound);
        }*/
        public override void MouseDownDraw(object sender, MouseEventArgs e)
        {
            draw=true;
            PictureBox pallet = sender as PictureBox;
            startP = e.Location;
        }

        public override void MouseMoveDraw(object sender, MouseEventArgs e)
        {
            if(!draw)
                return;
            PictureBox pallet = sender as PictureBox;
            Graphics g = pallet.CreateGraphics();
            this.DrawLine(e.Location);
            startP = e.Location;
        }

        public override void MouseUpDraw(object sender, MouseEventArgs e)
        {
            draw = false;
            PictureBox palette = sender as PictureBox;
            Graphics g = palette.CreateGraphics();
            this.DrawLine(e.Location);
            startP = e.Location;
        }
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor=colorDialog.Color;
                this.pen.Color=colorDialog.Color;
            }
        }
        private void SetWidth(object sender, EventArgs e)
        {
            NumericUpDown width = attr["set_pixel"] as NumericUpDown;
            pen.Width = (int)width.Value;
        }
        protected override void SetEventName()
        {
            eventName = new List<string>();
            eventName.Add("MouseDown");
            eventName.Add("MouseUp");
            eventName.Add("MouseMove");
        }
        protected override void SetEventMap()
        {
            eventMap = new Dictionary<string, MouseEventHandler>();
            eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
            eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
            eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
        }
    }
}

PatternTool.cs

using palette;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace pallet.Tools
{
    internal enum Pattern
    {
        Rectangle,Round
    }

    delegate void Draw();

    
    internal class PatternTool : Tool
    {
        private Draw draw;
        private static Panel panel;
        private System.Drawing.Rectangle bound;
        private Pattern pattern;
        private Point startP;
        private Point endP;
        private Point StartP
        {
            get { return startP; }
            set { startP = value; }
        }
        //设置矩形或椭圆的范围
        private Point EndP
        {
            get { return endP; }
            set 
            {
                endP = value;
                int x1=this.StartP.X;
                int y1=this.StartP.Y;
                int x2=value.X;
                int y2=value.Y;
                if (x1 > x2)
                    bound.X = x2;
                else
                    bound.X = x1;
                if (y1 > y2)
                    bound.Y = y2;
                else
                    bound.Y=y1;
                bound.Width = Math.Abs(x1-x2);
                bound.Height = Math.Abs(y1-y2);  
            }
        }
        public Pattern Pattern
        {
            get { return pattern; }
            set 
            {
                switch (value)
                {
                    case Pattern.Rectangle:; this.draw = this.DrawRectangule; break;
                    case Pattern.Round: this.draw = this.DrawRound;break;
                }
                pattern = value; 
                
            }
        }
        public PatternTool(Graphics g,PictureBox pbx) : base(pbx)
        {
            this.g = g;
            name = "形状工具";
            description = "拖动鼠标绘制直线";
            attr = new Dictionary<string, Control>();
            colorDialog = new ColorDialog();
            pen = new Pen(Color.Black);
            this.Pattern = Pattern.Round;
        }
        private void DrawRectangule()
        {
            this.g.DrawRectangle(pen, bound);
            this.pictureBox.Image = bitmap;
        }
        private void DrawRound()
        {
            this.g.DrawEllipse(pen, bound);
            this.pictureBox.Image = bitmap;
        }
        public override Panel GetAttrPanel()
        {
            if (panel != null)
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel", panel);
            //color
            Label color = new Label();
            color.Text = "颜色";
            panel.Controls.Add(color);
            attr.Add("color", color);
            //select_color
            PictureBox select_color = new PictureBox();
            select_color.Width = 30;
            select_color.Height = 30;
            select_color.Visible = true;
            select_color.BackColor = Color.Black;
            select_color.MouseDoubleClick += new MouseEventHandler(this.SelectColor);
            panel.Controls.Add(select_color);
            attr.Add("select_color", select_color);
            //pixel
            Label pixel = new Label();
            pixel.Text = "粗细";
            panel.Controls.Add(pixel);
            attr.Add("pixel", pixel);
            //set_pixel
            NumericUpDown set_pixel = new NumericUpDown();
            set_pixel.Width = 50;
            set_pixel.Minimum = 1;
            set_pixel.ValueChanged += new EventHandler(this.SetWidth);
            set_pixel.ReadOnly = true;
            panel.Controls.Add(set_pixel);
            attr.Add("set_pixel", set_pixel);
            set_pixel.Value = 5;
            //pattern
            Label pattern = new Label();
            pattern.Text = "形状";
            panel.Controls.Add(pattern);
            attr.Add("pattern", pattern);
            //set_pattern设置形状
            ComboBox set_pattern = new ComboBox();
            set_pattern.Width = 100;
            set_pattern.DropDownStyle = ComboBoxStyle.DropDownList;
            for(int i = 0; i < 10; i++)
            {
                Pattern p = (Pattern)i;
                if (p.ToString() != i.ToString())
                {
                    set_pattern.Items.Add(p);
                } 
            }
            set_pattern.SelectedIndexChanged += new EventHandler(this.SetPattern);
            panel.Controls.Add(set_pattern);
            attr.Add("set_pattern", set_pattern);
            set_pattern.SelectedIndex = 0;
            return panel;
        }

        private void SetPattern(object sender, EventArgs e)
        {
            ComboBox set_pattern = (ComboBox)sender;
            Pattern p = (Pattern)set_pattern.SelectedItem;
            if (p != null)
                this.Pattern = p;
        }

        public override void MouseClickDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseDownDraw(object sender, MouseEventArgs e)
        {
            this.StartP = e.Location;
        }

        public override void MouseMoveDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseUpDraw(object sender, MouseEventArgs e)
        {
            this.EndP = e.Location;
            PictureBox palette = sender as PictureBox;
            Graphics g = palette.CreateGraphics();
            this.draw();
        }
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor = colorDialog.Color;
                this.pen.Color = colorDialog.Color;
            }
        }
        private void SetWidth(object sender, EventArgs e)
        {
            NumericUpDown width = attr["set_pixel"] as NumericUpDown;
            pen.Width = (int)width.Value;
        }
        protected override void SetEventName()
        {
            eventName = new List<string>();
            eventName.Add("MouseDown");
            eventName.Add("MouseUp");
        }

        protected override void SetEventMap()
        {
            eventMap = new Dictionary<string, MouseEventHandler>();
            eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
            eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
            eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
        }
    }
}

PaintBuckt.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace palette.Tools
{
    internal class PaintBucket : Tool
    {
        private static Panel panel;
        private PictureBox pbx;
        public PaintBucket(Graphics g, PictureBox pbx) : base(pbx)
        {
            this.pbx = pbx;
            this.g = g;
            name = "油漆桶";
            description = "用于填充";
            attr = new Dictionary<string, Control>();
            colorDialog = new ColorDialog();
            pen = new Pen(Color.Black);
        }

        public override Panel GetAttrPanel()
        {
            if (panel != null)
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel", panel);
            //color
            Label color = new Label();
            color.Text = "颜色";
            panel.Controls.Add(color);
            attr.Add("color", color);
            //select_color
            PictureBox select_color = new PictureBox();
            select_color.Width = 30;
            select_color.Height = 30;
            select_color.Visible = true;
            select_color.BackColor = Color.Black;
            select_color.MouseDoubleClick += new MouseEventHandler(this.SelectColor);
            panel.Controls.Add(select_color);
            attr.Add("select_color", select_color);
            return panel;
        }
        private void Draw()
        {

            this.g.FillRectangle(pen.Brush,0,0, this.pbx.Width, this.pbx.Height);
            this.pictureBox.Image = this.Bitmap;
        }
        public override void MouseClickDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseDownDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseMoveDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseUpDraw(object sender, MouseEventArgs e)
        {
            this.Draw();
        }

        protected override void SetEventMap()
        {
            eventMap = new Dictionary<string, MouseEventHandler>();
            eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
        }

        protected override void SetEventName()
        {
            eventName = new List<string>();
            eventName.Add("MouseUp");
        }
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor = colorDialog.Color;
                this.pen.Color = colorDialog.Color;
            }
        }
    }
}

Line.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
namespace palette.Tools
{
    internal class Line : Tool
    {
        private Point startP;
        private Point endP;
        private static Panel panel;
        public Line(Graphics g,PictureBox pbx) :base(pbx)
        {
            this.g = g;
            name = "直线";
            description = "拖动鼠标绘制直线";
            attr = new Dictionary<string, Control>();
            colorDialog = new ColorDialog();
            pen = new Pen(Color.Black);
        }
        private void DrawLine(Graphics g)
        {
            //g.DrawLine(pen, startP, endP);
            this.g.DrawLine(pen, startP, endP);
            this.pictureBox.Image = this.Bitmap;
        }
        public override Panel GetAttrPanel()
        {
            if (panel != null)
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel", panel);
            //color
            Label color = new Label();
            color.Text = "颜色";
            panel.Controls.Add(color);
            attr.Add("color", color);
            //select_color
            PictureBox select_color = new PictureBox();
            select_color.Width = 30;
            select_color.Height = 30;
            select_color.Visible = true;
            select_color.BackColor = Color.Black;
            select_color.MouseDoubleClick += new MouseEventHandler(this.SelectColor);
            panel.Controls.Add(select_color);
            attr.Add("select_color", select_color);
            
            //pixel
            Label pixel = new Label();
            pixel.Text = "粗细";
            panel.Controls.Add(pixel);
            attr.Add("pixel", pixel);
            //set_pixel
            NumericUpDown set_pixel = new NumericUpDown();
            set_pixel.Width = 50;
            set_pixel.Minimum = 1;
            set_pixel.ValueChanged += new EventHandler(this.SetWidth);
            set_pixel.ReadOnly = true;
            panel.Controls.Add(set_pixel);
            attr.Add("set_pixel", set_pixel);
            set_pixel.Value = 5;
            return panel;
        }

        public override void MouseClickDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseDownDraw(object sender, MouseEventArgs e)
        {
            this.startP = e.Location;
        }

        public override void MouseMoveDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseUpDraw(object sender, MouseEventArgs e)
        {
            this.endP = e.Location;
            PictureBox palette = sender as PictureBox;
            Graphics g = palette.CreateGraphics();
            this.DrawLine(g);
        }
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor = colorDialog.Color;
                this.pen.Color = colorDialog.Color;
            }
        }
        private void SetWidth(object sender, EventArgs e)
        {
            NumericUpDown width = attr["set_pixel"] as NumericUpDown;
            pen.Width = (int)width.Value;
        }
        protected override void SetEventName()
        {
            eventName = new List<string>();
            eventName.Add("MouseDown");
            eventName.Add("MouseUp");
            //eventName.Add("MouseMove");
        }

        protected override void SetEventMap()
        {
            eventMap = new Dictionary<string, MouseEventHandler>();
            eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
            eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
            eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
        }
    }
}

Word

  • Word.cs
using pallet.Tools.Word;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace palette.Tools
{
    internal class Word : Tool
    {
        private static Panel panel;
        private PictureBox pbx;
        private SetWordDialog setWordDialog;
        public Word(Graphics g, PictureBox pbx) : base(pbx)
        {
            setWordDialog = new SetWordDialog();
            this.pbx = pbx;
            this.g = g;
            name = "文字工具";
            description = "用于填充";
            attr = new Dictionary<string, Control>();
            colorDialog = new ColorDialog();
            pen = new Pen(Color.Black);
        }

        public override Panel GetAttrPanel()
        {
            if (panel != null)
                return panel;
            panel = new FlowLayoutPanel();
            panel.BackColor = System.Drawing.SystemColors.AppWorkspace;
            panel.AutoSize = true;
            panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            panel.Dock = DockStyle.Top;
            attr.Add("panel", panel);
            //description
            Label font = new Label();
            font.Text = "点击添加文字";
            font.Font= new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
            panel.Controls.Add(font);
            attr.Add("color", font);
            return panel;
        }
        public override void MouseClickDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseDownDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseMoveDraw(object sender, MouseEventArgs e)
        {
            throw new NotImplementedException();
        }

        public override void MouseUpDraw(object sender, MouseEventArgs e)
        {
            string content;
            Font font;
            Color color;
            if (setWordDialog.ShowDialog() == DialogResult.OK)
            {
                content = setWordDialog.Content;
                font = setWordDialog.Font;
                color = setWordDialog.Color;
                
                try
                {
                    DrawString(g,e.Location,font,color,content);
                    this.pbx.Image = bitmap;
                }catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }
            
        }

        protected override void SetEventMap()
        {
            eventMap = new Dictionary<string, MouseEventHandler>();
            eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
        }

        protected override void SetEventName()
        {
            eventName = new List<string>();
            eventName.Add("MouseUp");
        }
        private void SelectColor(object sender, MouseEventArgs e)
        {
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                this.attr["select_color"].BackColor = colorDialog.Color;
                this.pen.Color = colorDialog.Color;
            }
        }

        private static void DrawString(Graphics g,Point p,Font font,Color color,string content)
        {
            Brush brush = new SolidBrush(color);
            g.DrawString(content, font, brush,p);
        }
    }
}
  • SetFontDIalog.cs

通过窗体的Font,Colot,Content属性来访问所设置的值。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace pallet.Tools.Word
{
    public partial class SetWordDialog : Form
    {
        private Font font;
        private Color color;
        private string content;

        public Font Font { 
            get => font; 
            set
            {
                font = value;
                DrawString(this.pictureBox2, Font.Name);
            } 
        }
        public Color Color
        {
            get => color; set
            {
                this.pictureBox1.BackColor = value;
                color = value;
            }
        }
        public string Content { get => content; set
            {
                content = value; 
                this.textBox1.Text = Content; 
            } 
        }

        public SetWordDialog()
        {
            InitializeComponent();
            this.Color = Color.Black;
            this.Content = "";
            this.Font= new System.Drawing.Font("微软雅黑", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (fontDialog1.ShowDialog() == DialogResult.OK)
            {
                this.Font = fontDialog1.Font;
            }
        }

        //设置
        private static void DrawString(PictureBox p, string content)
        {
            Graphics  g = p.CreateGraphics();
            Pen pen = new Pen(Color.Black);
            Font font = p.Font;
            g.DrawString(content,font,pen.Brush,0,0);
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            if (this.fontDialog1.ShowDialog() == DialogResult.OK)
            {
                this.Font = this.fontDialog1.Font;  
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (colorDialog1.ShowDialog() == DialogResult.OK)
            {
                this.Color = colorDialog1.Color;
            }
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            this.Content = textBox1.Text;
        }
    }
}
  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值