C#简单的绘图器

#这是自己学习做的简单绘图器,大家可以参考下下!
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. 自由绘制
    (1)圆和椭圆:实现圆与椭圆的绘制,位置和大小,颜色,画线等都可自由设置。
    (2)正方形和矩形:实现正方形与矩形的绘制,位置和大小,颜色,画线等都可自由设置。
    (3)三角形:实现三角形的绘制,位置和大小,颜色,画线等都可自由设置。
    (4)无规则画画:实现无规则的绘制,位置和大小,颜色,画线等都可自由设置。
  2. 工具栏(两行):如上图所示,第一栏有能实现颜色的选择,橡皮擦的功能。第二栏有能实现图形的选择,线条粗细的选择,图形的放大与缩小功能。
  3. 状态栏:点击一下可以显示本地时间。
  4. 系统设计
    3.1总体设计
    3.1.1基本思路:
    总体设计的目的就是要回答“概括地说,系统应该如何去实现?”对于这个问题,结合自身的选题,也就是需要我们设计出一个完善的模型,让程序员与软件设计人员清楚绘图器的系统结构和软件结构。
    3.1.2遇到的问题及解决方法:
  5. 重新绘图时,我一开始没想到,总是出现系统程序错误,要求中断程序。
    解决方法:可以再新建一层画布,这样就可以利用清除画像后,新建画布后又可以选择图案进行绘制啦。
  6. 画三角形,发现利用简单调用 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);
  7. 选择粗细问题,Combox中用了foreach,每次下拉总会增加相同的选项
    解决办法:在foreach语句前加上 toolStripComboBox1.Items.Clear();利用其Clear方法来清空。
    4.利用timer控件想在窗口底部显示出来,发现时间不能正常显示
    解决办法:触发toolStripLabel1_Click事件,也就是点击其功能。
    5.在设置颜色的时候,发现自身的画笔设置数目多了一个,导致数组越界。
    解决方法:设置画笔尽量数量大于现有的数量。
  8. list或relist中没有对象时仍然点击撤销或者重做,导致程序出现错误,出现功能错乱。
    解决方法:在执行时检查对象数目,当最后一个对象释放后,控件Enable属性设为false。
  9. 橡皮擦功能:一开始我是调用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
写在最后,主要是自己学的知识不够深入,怎么改变呢,自己需花更多时间在敲代码身上,自己学习还是自己的事儿。好好学习吧,利用琐碎时间,慢慢补上来,一些不懂的知识,还有需要了解更多的前沿知识。同时学学自己感兴趣的前端技术。一切靠自己!

附上小视频

绘图器演示视频

  • 16
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值