目录
前言
一、整体思路
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编程。此程序实现了简单的画笔,油漆桶,文字,形状(矩形和椭圆)工具等功能以及对工具属性的设置。
软件的主要界面由VisualStuidio窗体设计器交互式生成。
画图功能由一个抽象类 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事件。
由于Tools需要操作主窗体中的PictureBox对象,所以需要Tool在构造时需要将PictureBox的相关的一些对象。
由于Tools具体的实现类所需的事件各不相同,所以我将具体的实现类所用到的事件保存在该具体实现类的一个字段中。
由于Tools实现类的的属性面板不同,所以每个实现类都有一个Panel panel字段来保存属性面板信息且必须实现抽象方法public abstract Panel GetAttrPanel();
由于在Tools.GetAttrPanel(),所有的控件没有保存在Tool的字段或属性中,所以控件虽然存在但是是不可访问的。而当更改一些该工具的一些属性(如颜色)时,一些控件需要做出相应的调整来和实际相匹配,所用我用一个字典 protected Dictionary
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;
}
在事件的操作上,在切换工具时,由于我没有移除原本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 Tools;//保存Tool的实例
private Panel attr_panel;//属性面板
private Tool SelectTool;//当前选择的工具
public Form1()
{
Tools = new List();
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 events = tool.MouseHandller;
List 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 events = tool.MouseHandller;
List 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();
}
}
}
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;
}
}
}
SetWordDialog用于设置文字的字体;调用ShowDialog()时返回一个DialogResult枚举值,需要将一个按钮的DialogResult属性设置为DialogResult.OK;
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 attr;
protected Pen pen;
protected Graphics g;
protected List eventName;
protected Dictionary eventMap;
public Bitmap Bitmap { get => this.bitmap; set => this.bitmap=value; }
public Graphics Graphics { set => this.g = value; }
public List EventName {get => this.eventName;}
public Dictionary 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();
}
}
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();
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();
eventName.Add("MouseDown");
eventName.Add("MouseUp");
eventName.Add("MouseMove");
}
protected override void SetEventMap()
{
eventMap = new Dictionary();
eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
}
}
}
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();
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();
eventName.Add("MouseDown");
eventName.Add("MouseUp");
}
protected override void SetEventMap()
{
eventMap = new Dictionary();
eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
}
}
}
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();
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();
eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
}
protected override void SetEventName()
{
eventName = new List();
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;
}
}
}
}
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();
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();
eventName.Add("MouseDown");
eventName.Add("MouseUp");
//eventName.Add("MouseMove");
}
protected override void SetEventMap()
{
eventMap = new Dictionary();
eventMap.Add("MouseDown", new MouseEventHandler(this.MouseDownDraw));
eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
eventMap.Add("MouseMove", new MouseEventHandler(this.MouseMoveDraw));
}
}
}
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();
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();
eventMap.Add("MouseUp", new MouseEventHandler(this.MouseUpDraw));
}
protected override void SetEventName()
{
eventName = new List();
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);
}
}
}
通过窗体的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;
}
}
}