#这是自己学习做的简单绘图器,大家可以参考下下!
2.2开发环境:
开发平台:Microsoft Windows 10
开发工具:采用Visual Studio 2017来进行系统开发。
2.3需求规定:
该程序能基本完成绘制基础图形的基本要求。我们考虑,应与题目相结合,除了具备题目所说的4项基本功能要实现的,还需增加一些有创意功能,如在文件选项栏中保存图片功能,编辑选项栏中新增撤销,重做这两项,分别实现上一步和下一步的操作。在关于栏中新增查看作者的信息,及工具栏中有橡皮擦和显示当地时间的贴心功能。
设计要求:
1)设计菜单选项,可以选择画笔颜色以及所画形状,如椭圆、三角、正方型等。
2)设计按钮,可以将绘画的内容擦除,并进行重画。
3)可以任意画图,也可以使用菜单上的选项画具体形状的图形。
*4)具体图形的大小可以通过对话框进行设定。
详细设计
1.主页面
2.文件
(1)新建:新建窗口
(2)保存:保存图形
(3)退出:退出窗口
3.编辑
(1)撤销:实现上一步操作
(2)重做:实现下一步操作
(3)清除画像:实现画像的擦除。
4.帮助
(1)关于:显示作者的信息
- 自由绘制
(1)圆和椭圆:实现圆与椭圆的绘制,位置和大小,颜色,画线等都可自由设置。
(2)正方形和矩形:实现正方形与矩形的绘制,位置和大小,颜色,画线等都可自由设置。
(3)三角形:实现三角形的绘制,位置和大小,颜色,画线等都可自由设置。
(4)无规则画画:实现无规则的绘制,位置和大小,颜色,画线等都可自由设置。 - 工具栏(两行):如上图所示,第一栏有能实现颜色的选择,橡皮擦的功能。第二栏有能实现图形的选择,线条粗细的选择,图形的放大与缩小功能。
- 状态栏:点击一下可以显示本地时间。
- 系统设计
3.1总体设计
3.1.1基本思路:
总体设计的目的就是要回答“概括地说,系统应该如何去实现?”对于这个问题,结合自身的选题,也就是需要我们设计出一个完善的模型,让程序员与软件设计人员清楚绘图器的系统结构和软件结构。
3.1.2遇到的问题及解决方法: - 重新绘图时,我一开始没想到,总是出现系统程序错误,要求中断程序。
解决方法:可以再新建一层画布,这样就可以利用清除画像后,新建画布后又可以选择图案进行绘制啦。 - 画三角形,发现利用简单调用 g.DrawPolygon(pen[x], p);是不行的,现在是动态画三角形的问题。困扰了我许久。
解决方法:在鼠标移动功能下,先把当前鼠标移动的点赋给末尾节点EndPoint,也就是EndPoint.X = e.X; EndPoint.Y = e.Y;
在鼠标释放功能下,执行以下功能:
Point CurrentPoint = new Point(e.X, e.Y);
Point p1 = new Point(StartPoint.X, StartPoint.Y);
Point p2 = new Point(2*StartPoint.X- CurrentPoint.X, CurrentPoint.Y);
Point p3 = new Point(EndPoint.X, EndPoint.Y);
Point[] p = { p1, p2, p3 };
g.DrawPolygon(pen[x], p); - 选择粗细问题,Combox中用了foreach,每次下拉总会增加相同的选项
解决办法:在foreach语句前加上 toolStripComboBox1.Items.Clear();利用其Clear方法来清空。
4.利用timer控件想在窗口底部显示出来,发现时间不能正常显示
解决办法:触发toolStripLabel1_Click事件,也就是点击其功能。
5.在设置颜色的时候,发现自身的画笔设置数目多了一个,导致数组越界。
解决方法:设置画笔尽量数量大于现有的数量。 - list或relist中没有对象时仍然点击撤销或者重做,导致程序出现错误,出现功能错乱。
解决方法:在执行时检查对象数目,当最后一个对象释放后,控件Enable属性设为false。 - 橡皮擦功能:一开始我是调用Clear()函数和设置pictureBox1.Image = null;把一下子是把所有图案给擦除了。
解决方法:利用白线画笔来覆盖:
pictureBox1.Enabled = true;
x = 8;
toolStripButtonGum.BackColor = Color.SkyBlue;
pictureBox1.Cursor = Cursors.Cross;
d = 3;
3.2功能设计
1.文件
(1)新建:新建窗口
(2)保存:保存图形
(3)退出:退出窗口
2.编辑
(1)撤销:实现上一步操作
(2)重做:实现下一步操作
(3)清除画像:实现画像的擦除。
3.帮助
(1)关于:显示作者的信息
4.自由绘制
(1)圆和椭圆:实现圆与椭圆的绘制,位置和大小,颜色,画线等都可自由设置。
(2)正方形和矩形:实现正方形与矩形的绘制,位置和大小,颜色,画线等都可自由设置。
(3)三角形:实现三角形的绘制,位置和大小,颜色,画线等都可自由设置。
(4)无规则画画:实现无规则的绘制,位置和大小,颜色,画线等都可自由设置。
(一)菜单
(二)工具栏
第一栏有能实现颜色的选择,橡皮擦的功能。第二栏有能实现图形的选择,线条粗细的选择,图形的放大与缩小功能。
(三)方法
(1)GetLineWidth()方法:实现钢笔的粗线,进行选择,默认粗细设置为一磅。
ChangeColor()方法:实现颜色的改变
(2)绘制各个图形的方法:矩形,三角形,椭圆,圆,正方形,线
(3)DrawPicture()方法:各项绘图按键选择的总和,同时将此时的图像push到list里,用于后面撤销操作。
(四)事件
(1)pictureBox1_MouseDown事件:当鼠标按下去是,获取点坐标,并分别赋值给StartPoint.X , StartPoint.Y ; EndPoint.X , EndPoint.Y ;同时将此时的图像push到list里,用于后面撤销操作。
(2)pictureBox1_MouseMove事件:分别对自由绘制选项栏各个功能去绘制图形,进行拖拉到适合的位置和大小。
(3) pictureBox1_MouseUp事件:用于最终绘制出自由绘制选项栏各个功能的图形。
4.1源程序清单
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace CC
{
public partial class Form1 : Form
{
Graphics g; Graphics graphics;//Graphics类封装了一个GDI+绘图图面,提供将对象绘制到显示到设备的方法(画板)
Image image; //Image 就是个图像,不能实例化,
Bitmap canvas; //Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成。
//Bitmap 是用于处理由像素数据定义的图像的对象。(画纸)
Point StartPoint; Point EndPoint;
Stack<Bitmap> list = new Stack<Bitmap>();
Stack<Bitmap> relist = new Stack<Bitmap>();
Pen[] pen = new Pen[9];
int x,t,b=8,d=5;//x从0-8表示可选的9种颜色;t从0-4表示可选的5种画图方法;
//b表示可放大或者缩小的倍数;d表示自由绘制时选择的功能。
float penf; //penf表示绘制时候线的粗细,默认值为1磅
string z1, z2;//z1表示描述图形的形状,z2表示描述图形的颜色
bool ok0 = false, ok1=false, ok2=false,ok3=false;//设置四个启动标志
public Form1()
{
InitializeComponent();
}
public float GetLineWidth()
{
switch (toolStripComboBox1.Text)
{
case "0.5磅":
return 0.5f;
case "1磅":
return 1.0f;
case "1.25磅":
return 1.25f;
case "1.5磅":
return 1.5f;
case "3磅":
return 3.0f;
default:
return 1.0f;
}
}
public void ChangeColor()//改变颜色的方法
{
penf = GetLineWidth();
pen[0] = new Pen(Color.Red,penf);
pen[1] = new Pen(Color.Yellow, penf);
pen[2] = new Pen(Color.Blue, penf);
pen[3] = new Pen(Color.Green, penf);
pen[4] = new Pen(Color.Black, penf);
pen[5] = new Pen(Color.Purple, penf);
pen[6] = new Pen(Color.Orange, penf);
pen[7] = new Pen(Color.Pink, penf);
pen[8] = new Pen(Color.White,penf);
}
public void DrawPicture()
{
canvas = new Bitmap(image);
list.Push(canvas);
撤销ToolStripMenuItem.Enabled = true;
try
{
switch (t)
{
case 0:
DrawCircle();
break;
case 1:
DrawTriangle();
break;
case 2:
DrawRectangle();
break;
case 3:
DrawSquare();
break;
case 4:
DrawEllispe();
break;
case 5:
DrawLine();
break;
default:
MessageBox.Show("你还没有选择");
break;
}
}
catch
{
MessageBox.Show("绘制失败");
}
}
private Rectangle MakeRectangle(Point p1, Point p2)
{
int top, left, bottom, right;
top = p1.Y <= p2.Y ? p1.Y : p2.Y;//计算矩形左上角点的y坐标
left = p1.X <= p2.X ? p1.X : p2.X;//计算矩形左上角点的x坐标
bottom = p1.Y > p2.Y ? p1.Y : p2.Y;//计算矩形右下角点的y坐标
right = p1.X > p2.X ? p1.X : p2.X;//计算矩形右下角点的x坐标
return (new Rectangle(left, top, right - left, bottom - top));//返回矩形
}
public void DrawTriangle() //画三角形方法
{
ChangeColor();
Point[] p = new Point[3];
p[0] = new Point(20 * b, 20 * b);
p[1] = new Point(30 * b, 20 * b);
p[2] = new Point(20 * b, 40 * b);
g.DrawPolygon(pen[x], p);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawCircle()//画圆方法
{
ChangeColor();
int centre_x = 10,centre_y = 10;
int R = 2;
g.DrawEllipse(pen[x], (centre_x - R)*b, (centre_y - R) * b, (centre_x + R) * b, (centre_y +R) * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawEllispe()//画椭圆的方法
{
ChangeColor();
g.DrawEllipse(pen[x], pictureBox1.Width /64 *b, pictureBox1.Height / 64 * b, pictureBox1.Width / 32 * b, pictureBox1.Height / 32 * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawRectangle()//画矩形的方法
{
ChangeColor();
Rectangle r4 = new Rectangle(pictureBox1.Width/64 * b, pictureBox1.Height/64 * b, pictureBox1.Width/32 * b, pictureBox1.Height/32 * b);
g.DrawRectangle(pen[x], r4);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawSquare()//画正方形方法
{
ChangeColor();
Rectangle r5 = new Rectangle(8 * b, 8 * b, 8 * b, 8 * b);
g.DrawRectangle(pen[x], r5);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawLine()
{
ChangeColor();
g.DrawLine(pen[x], pictureBox1.Width / 64 * b, pictureBox1.Height / 64 * b, pictureBox1.Width / 32 * b, pictureBox1.Height / 32 * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
//鼠标按下
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
canvas = new Bitmap(image);
list.Push(canvas);
撤销ToolStripMenuItem.Enabled = true;
if (e.Button == MouseButtons.Left)
{
StartPoint.X = e.X;
StartPoint.Y = e.Y;
EndPoint.X = e.X;
EndPoint.Y = e.Y;
}
switch (d)
{
case 0:
ok0 = true;
break;
case 1:
ok1 = true;
break;
case 2:
ok2 = true;
break;
case 3:
ok3 = true;
break;
default:MessageBox.Show("选择错误");
break;
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
penf = GetLineWidth();
ChangeColor();
if (ok0&&d==0)
{
Rectangle r1 = MakeRectangle(StartPoint, EndPoint);//计算重画区域
r1.Height += 2;
r1.Width += 2;//区域增大些
pictureBox1.Invalidate(r1);//擦除上次鼠标移动时画的图形,r1为擦除区域
pictureBox1.Update();//立即重画,即擦除
Graphics g = pictureBox1.CreateGraphics();
EndPoint.X = e.X;
EndPoint.Y = e.Y;
r1 = MakeRectangle(StartPoint, EndPoint);//计算椭圆新位置
g.DrawEllipse(pen[x], r1);//在新位置画椭圆
}
if (ok1 && d == 1)
{
Rectangle r2 = MakeRectangle(StartPoint, EndPoint);
r2.Height += 2;
r2.Width += 2;//区域增大些
pictureBox1.Invalidate(r2);//擦除上次鼠标移动时画的图形,r1为擦除区域
pictureBox1.Update();//立即重画,即擦除
Graphics g = pictureBox1.CreateGraphics();
EndPoint.X = e.X;
EndPoint.Y = e.Y;
r2 = MakeRectangle(StartPoint, EndPoint);
g.DrawRectangle(pen[x], r2);
}
if (ok2 && d == 2)
{
EndPoint.X = e.X;
EndPoint.Y = e.Y;
}
if (ok3&&d==3)
{
StartPoint.X = e.X;
StartPoint.Y = e.Y;
g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿
g.DrawLine(pen[x], EndPoint, StartPoint);
EndPoint.X = StartPoint.X;
EndPoint.Y = StartPoint.Y;
}
}
//鼠标释放
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
ChangeColor();
switch (d)
{
case 0:
EndPoint.X = e.X;
EndPoint.Y = e.Y;
Rectangle r1 = MakeRectangle(StartPoint, EndPoint);
g.DrawEllipse(pen[x], r1);
ok0 = false;
break;
case 1:
EndPoint.X = e.X;
EndPoint.Y = e.Y;
Rectangle r2 = MakeRectangle(StartPoint, EndPoint);
g.DrawRectangle(pen[x], r2);
ok1= false;
break;
case 2:
Point CurrentPoint = new Point(e.X, e.Y);
Point p1 = new Point(StartPoint.X, StartPoint.Y);
Point p2 = new Point(2*StartPoint.X- CurrentPoint.X, CurrentPoint.Y);
Point p3 = new Point(EndPoint.X, EndPoint.Y);
Point[] p = { p1, p2, p3 };
g.DrawPolygon(pen[x], p);
ok2 = false;
break;
case 3:
ok3 = false;
break;
default:
MessageBox.Show("选择错误");
break;
}
pictureBox1.Image = image;
}
private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
MessageBox.Show("所输入正数8以下为缩小倍数,8以上为放大倍数");
}
private void textBox1_MouseEnter(object sender, EventArgs e)
{
textBox1.Text = null;
}
private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
{
关于ToolStripMenuItem.BackColor = Color.SkyBlue;
(new Author()).ShowDialog();
}
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
退出ToolStripMenuItem.BackColor = Color.Orange;
MessageBox.Show("你将退出本程序!");
Application.Exit();
}
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
保存ToolStripMenuItem.BackColor = Color.Orange;
SaveFileDialog file = new SaveFileDialog();
file.Filter = "png(*png)|*.png";
if (image != null)
{
if (file.ShowDialog() == DialogResult.OK)
{
string fn = file.FileName;
image.Save(fn, ImageFormat.Bmp);
MessageBox.Show("保存成功");
}
}
}
private void Red_ButtonClick(object sender, EventArgs e)
{
x = 0;
z2 = "红色";
}
private void Yellow_ButtonClick(object sender, EventArgs e)
{
x = 1;
z2 = "黄色";
}
private void Blue_ButtonClick(object sender, EventArgs e)
{
x = 2;
z2 = "蓝色";
}
private void Green_Click(object sender, EventArgs e)
{
x = 3;
z2 = "绿色";
}
private void Black_ButtonClick(object sender, EventArgs e)
{
x = 4;
z2 = "黑色";
}
private void Purple_ButtonClick(object sender, EventArgs e)
{
x = 5;
z2 = "紫色";
}
private void 橙色ToolStripMenuItem_Click(object sender, EventArgs e)
{
橙色ToolStripMenuItem.BackColor = Color.Orange;
x = 6;
z2 = "橙色";
}
private void 粉红色ToolStripMenuItem_Click(object sender, EventArgs e)
{
粉红色ToolStripMenuItem.BackColor = Color.Pink;
x = 7;
z2 = "粉红色";
}
private void toolStripSplitButtonCircle_ButtonClick(object sender, EventArgs e)
{
t = 0;
DrawPicture();
z1 = "圆";
}
private void toolStripSplitButtonTriangle_ButtonClick(object sender, EventArgs e)
{
t = 1;
DrawPicture();
z1 = "三角形";
}
private void toolStripSplitButtonRectangle_ButtonClick(object sender, EventArgs e)
{
t = 2;
DrawPicture();
z1 = "长方形";
}
private void toolStripSplitButtonSquare_ButtonClick(object sender, EventArgs e)
{
t = 3;
DrawPicture();
z1 = "正方形";
}
private void toolStripSplitButtonEllispe_ButtonClick(object sender, EventArgs e)
{
t = 4;
DrawPicture();
z1 = "椭圆";
}
private void toolStripComboBox1_Click(object sender, EventArgs e)
{
List <string>list= new List<string>() { "0.5磅", "1.0磅", "1.25磅", "1.5磅", "3磅" };
//foreach (string v in toolStripComboBox1.Items)
//{
// if (!list.Contains(v))
// {
// list.Add(v);
// }
//}
toolStripComboBox1.Items.Clear();
foreach (string s in list)
{
toolStripComboBox1.Items.Add(s);
}
}
private void toolStripSplitButtonLine_ButtonClick(object sender, EventArgs e)
{
t = 5;
DrawPicture();
z1 = "线";
}
private void toolStripButtonGum_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
x = 8;
toolStripButtonGum.BackColor = Color.SkyBlue;
pictureBox1.Cursor = Cursors.Cross;
d = 3;
}
private void Form1_Load(object sender, EventArgs e)
{
graphics = pictureBox1.CreateGraphics();
pictureBox1.BackColor = Color.White;
image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(image);
g.Clear(Color.White);
graphics.Clear(Color.White);
}
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
新建ToolStripMenuItem.BackColor = Color.Orange;
graphics = pictureBox1.CreateGraphics();
pictureBox1.BackColor = Color.White;
image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(image);
g.Clear(Color.White);
pictureBox1.Refresh();
g.Clear(Color.White);
graphics.Clear(Color.White);
}
private void 撤销ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
撤销ToolStripMenuItem.BackColor = Color.Pink;
if (list.Count != 0)
{
Bitmap b2 = new Bitmap(image);
relist.Push(b2);
canvas = list.Pop();
graphics = Graphics.FromImage(canvas);
image = canvas;
g.DrawImage(canvas, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
重做ToolStripMenuItem.Enabled = true;
}
if (list.Count < 1)
{
撤销ToolStripMenuItem.Enabled = false;
textBox1.Text = "已经到最后一步";
}
}
private void 重做ToolStripMenuItem_Click(object sender, EventArgs e)
{
重做ToolStripMenuItem.BackColor = Color.Pink;
if (relist.Count != 0)
{
canvas = relist.Pop();//弹出 出栈
Bitmap b2 = new Bitmap(image);
list.Push(b2);//推入 进栈
image = canvas;
graphics = Graphics.FromImage(canvas);
pictureBox1.Image = canvas;
撤销ToolStripMenuItem.Enabled = true;
g.DrawImage(canvas, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
if (relist.Count < 1)
{
重做ToolStripMenuItem.Enabled = false;
textBox1.Text="已经到最后一步";
}
}
}
private void 清除画像ToolStripMenuItem_Click(object sender, EventArgs e)
{
清除画像ToolStripMenuItem.BackColor = Color.Pink;
g.Clear(Color.White);
graphics.Clear(Color.White);
pictureBox1.Image = null;
textBox1.Text = null;
pictureBox1.Cursor = Cursors.Default;
}
private void toolStripLabel1_Click(object sender, EventArgs e)
{
toolStripLabel1.Text = Convert.ToString(System.DateTime.Now);
}
private void toolStripButton2_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Refresh();
b = Convert.ToInt32(textBox1.Text);
if (b > 8)
{
textBox1.Text = "将在原画上以各参数乘以" + b + "放大,请重新选择颜色和图形!";
}
}
catch
{ MessageBox.Show("你输入非法字符串,请输入正数"); }
}
private void toolStripButton3_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Refresh();
b = Convert.ToInt32(textBox1.Text);
if (b <= 8)
{
textBox1.Text = "将在原画上以各参数乘以" + b + "缩小,请重新选择颜色和图形!";
}
}
catch
{ MessageBox.Show("你输入非法字符串,请输入正数"); }
}
private void 圆和椭圆ToolStripMenuItem_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
textBox1.Text = null;
d = 0;
}
private void 长方形和矩形ToolStripMenuItem_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
textBox1.Text = null;
d = 1;
}
private void 三角形ToolStripMenuItem1_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
textBox1.Text = null;
d = 2;
}
private void 无规则画画ToolStripMenuItem_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
textBox1.Text = null;
d = 3;
}
private void ButtonStart_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
textBox1.Text = "您选的是" + z1 + "和" + z2 +"\r\n"+ "成功绘制" + z1;
pictureBox1.Image = image;
}
}
}
##功能实现
一、菜单
1.文件
(1)新建:实现新建功能,同时创建画板
private void 新建ToolStripMenuItem_Click(object sender, EventArgs e)
{
新建ToolStripMenuItem.BackColor = Color.Orange;
graphics = pictureBox1.CreateGraphics();
pictureBox1.BackColor = Color.White;
image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
g = Graphics.FromImage(image);
g.Clear(Color.White);
pictureBox1.Refresh();
g.Clear(Color.White);
graphics.Clear(Color.White);
}
(2)保存:实现保存功能,将保存文件类型限定为png。
private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
保存ToolStripMenuItem.BackColor = Color.Orange;
SaveFileDialog file = new SaveFileDialog();
file.Filter = "png(*png)|*.png";
if (image != null)
{
if (file.ShowDialog() == DialogResult.OK)
{
string fn = file.FileName;
image.Save(fn, ImageFormat.Bmp);
MessageBox.Show("保存成功");
}
}
}
(3)退出:实现退出功能,用exit方法退出程序,并设置提示语。
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
退出ToolStripMenuItem.BackColor = Color.Orange;
MessageBox.Show("你将退出本程序!");
Application.Exit();
}
2.编辑
(1)撤销:将当前图像push进relist中 以便后面的重做操作,将之前list中储存的图像释放 出来,
并赋给image,就可以实现后台的image也随图像的释放而改变, g.DrawImage()方法将释放的图像画出来,if的作用可以使得当list中没有图像储存时,撤销按键将不可用。
private void 撤销ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
撤销ToolStripMenuItem.BackColor = Color.Pink;
if (list.Count != 0)
{
Bitmap b2 = new Bitmap(image);
relist.Push(b2);
canvas = list.Pop();
graphics = Graphics.FromImage(canvas);
image = canvas;
g.DrawImage(canvas, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
重做ToolStripMenuItem.Enabled = true;
}
if (list.Count < 1)
{
撤销ToolStripMenuItem.Enabled = false;
textBox1.Text = "已经到最后一步";
}
}
(2)重做:调用Pop()方法把relist中上一次图像弹出,再将image推进list中,把canvas释放的图像赋值image,就可以实现后台的image也随图像的释放而改变, g.DrawImage()方法将释放的图像画出来,if的作用可以使得当relist中没有图像储存时,重做按键将不可用。
private void 重做ToolStripMenuItem_Click(object sender, EventArgs e)
{
重做ToolStripMenuItem.BackColor = Color.Pink;
if (relist.Count != 0)
{
canvas = relist.Pop();//弹出 出栈
Bitmap b2 = new Bitmap(image);
list.Push(b2);//推入 进栈
image = canvas;
graphics = Graphics.FromImage(canvas);
pictureBox1.Image = canvas;
撤销ToolStripMenuItem.Enabled = true;
g.DrawImage(canvas, 0, 0, pictureBox1.Size.Width, pictureBox1.Size.Height);
if (relist.Count < 1)
{
重做ToolStripMenuItem.Enabled = false;
textBox1.Text="已经到最后一步";
}
}
}
(3)清除画像:通过白色背景色填充来清除画像,同时把pictureBox1.Image 设置为null; textBox1.Text 设置为null;将鼠标形状回复为默认的Default。
private void 清除画像ToolStripMenuItem_Click(object sender, EventArgs e)
{
清除画像ToolStripMenuItem.BackColor = Color.Pink;
g.Clear(Color.White);
graphics.Clear(Color.White);
pictureBox1.Image = null;
textBox1.Text = null;
pictureBox1.Cursor = Cursors.Default;
}
3.帮助
(1)关于
新建一个Author窗口,显示作者基本信息。
4.自由绘制
(1)圆和椭圆:实现圆与椭圆的绘制,位置和大小,颜色,画线等都可自由设置。
(2)正方形和矩形:实现正方形与矩形的绘制,位置和大小,颜色,画线等都可自由设置。
(3)三角形:实现三角形的绘制,位置和大小,颜色,画线等都可自由设置。
(4)无规则画画:实现无规则的绘制,位置和大小,颜色,画线等都可自由设置。
二、工具栏(两行):
如上图所示,第一栏有能实现颜色的选择,橡皮擦的功能。第二栏有能实现图形的选择,线条粗细的选择,图形的放大与缩小功能。
(1)橡皮擦按键:利用白线画笔来覆盖图像。
private void toolStripButtonGum_Click(object sender, EventArgs e)
{
pictureBox1.Enabled = true;
x = 8;
toolStripButtonGum.BackColor = Color.SkyBlue;
pictureBox1.Cursor = Cursors.Cross;
d = 3;
}
(2)放大与缩小:通过设置一个变量b,在对话框中输入一个整数来进行图案的放大缩小,所输入正数8以下为缩小倍数,8以上为放大倍数。
private void toolStripButton2_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Refresh();
b = Convert.ToInt32(textBox1.Text);
if (b > 8)
{
textBox1.Text = "将在原画上以各参数乘以" + b + "放大,请重新选择颜色和图形!";
}
}
catch
{ MessageBox.Show("你输入非法字符串,请输入正数"); }
}
private void toolStripButton3_Click(object sender, EventArgs e)
{
try
{
pictureBox1.Refresh();
b = Convert.ToInt32(textBox1.Text);
if (b <= 8)
{
textBox1.Text = "将在原画上以各参数乘以" + b + "缩小,请重新选择颜色和图形!";
}
}
catch
{ MessageBox.Show("你输入非法字符串,请输入正数"); }
}
(3)状态栏:点击一下可以显示本地时间。
private void toolStripLabel1_Click(object sender, EventArgs e)
{
toolStripLabel1.Text = Convert.ToString(System.DateTime.Now);
}
三、方法
(1)GetLineWidth()方法:实现钢笔的粗线,进行选择,默认粗细设置为一磅。
ChangeColor()方法:实现颜色的改变
public float GetLineWidth()
{
switch (toolStripComboBox1.Text)
{
case "0.5磅":
return 0.5f;
case "1磅":
return 1.0f;
case "1.25磅":
return 1.25f;
case "1.5磅":
return 1.5f;
case "3磅":
return 3.0f;
default:
return 1.0f;
}
}
public void ChangeColor()//改变颜色的方法
{
penf = GetLineWidth();
pen[0] = new Pen(Color.Red,penf);
pen[1] = new Pen(Color.Yellow, penf);
pen[2] = new Pen(Color.Blue, penf);
pen[3] = new Pen(Color.Green, penf);
pen[4] = new Pen(Color.Black, penf);
pen[5] = new Pen(Color.Purple, penf);
pen[6] = new Pen(Color.Orange, penf);
pen[7] = new Pen(Color.Pink, penf);
pen[8] = new Pen(Color.White,penf);
}
(2)绘制各个图形的方法:三角形,圆,椭圆,矩形,正方形
public void DrawTriangle() //画三角形方法
{
ChangeColor();
Point[] p = new Point[3];
p[0] = new Point(20 * b, 20 * b);
p[1] = new Point(30 * b, 20 * b);
p[2] = new Point(20 * b, 40 * b);
g.DrawPolygon(pen[x], p);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawCircle()//画圆方法
{
ChangeColor();
int centre_x = 10,centre_y = 10;
int R = 2;
g.DrawEllipse(pen[x], (centre_x - R)*b, (centre_y - R) * b, (centre_x + R) * b, (centre_y +R) * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawEllispe()//画椭圆的方法
{
ChangeColor();
g.DrawEllipse(pen[x], pictureBox1.Width /64 *b, pictureBox1.Height / 64 * b, pictureBox1.Width / 32 * b, pictureBox1.Height / 32 * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawRectangle()//画矩形的方法
{
ChangeColor();
Rectangle r4 = new Rectangle(pictureBox1.Width/64 * b, pictureBox1.Height/64 * b, pictureBox1.Width/32 * b, pictureBox1.Height/32 * b);
g.DrawRectangle(pen[x], r4);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawSquare()//画正方形方法
{
ChangeColor();
Rectangle r5 = new Rectangle(8 * b, 8 * b, 8 * b, 8 * b);
g.DrawRectangle(pen[x], r5);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
public void DrawLine()
{
ChangeColor();
g.DrawLine(pen[x], pictureBox1.Width / 64 * b, pictureBox1.Height / 64 * b, pictureBox1.Width / 32 * b, pictureBox1.Height / 32 * b);
pictureBox1.Update();//立即重画,即擦除
pen[x].Dispose();
}
(3)DrawPicture()方法:各项绘图按键选择的总和,同时将此时的图像push到list里,用于后面撤销操作。
public void DrawPicture()
{
canvas = new Bitmap(image);
list.Push(canvas);
撤销ToolStripMenuItem.Enabled = true;
try
{
switch (t)
{
case 0:
DrawCircle();
break;
case 1:
DrawTriangle();
break;
case 2:
DrawRectangle();
break;
case 3:
DrawSquare();
break;
case 4:
DrawEllispe();
break;
case 5:
DrawLine();
break;
default:
MessageBox.Show("你还没有选择");
break;
}
}
catch
{
MessageBox.Show("绘制失败");
}
}
##测试结果
##END
写在最后,主要是自己学的知识不够深入,怎么改变呢,自己需花更多时间在敲代码身上,自己学习还是自己的事儿。好好学习吧,利用琐碎时间,慢慢补上来,一些不懂的知识,还有需要了解更多的前沿知识。同时学学自己感兴趣的前端技术。一切靠自己!
附上小视频
绘图器演示视频