当前位置: 首页 > news >正文

C#画图板的详细示例代码

当然可以。下面是一个更详细的C#画图板示例代码,它使用WindowsForms,并实现了基本的绘图功能,包括线条、矩形和椭圆的绘制。此外,该示例还使用了双缓冲技术来减少闪烁,并将绘制的图形保存在一个列表中,以便在窗体重新绘制时能够恢复它们。

 

首先,创建一个新的WindowsForms应用程序项目,并在Form1的设计视图中添加一个Panel控件作为绘图区域。然后,按照以下步骤添加代码:

 

2. 打开你的项目,并在Form1.cs中添加以下代码:

 

【csharp】

 using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace DrawingBoardApp

{

    public partial class Form1 : Form

    {

        private List<Shape> shapes = new List<Shape>();

        private bool isDrawing = false;

        private Shape currentShape = null;

        private Point lastPoint = Point.Empty;

 

        public Form1()

        {

            InitializeComponent();

            this.panel1.Paint += new PaintEventHandler(Panel1_Paint);

            this.panel1.MouseDown += new MouseEventHandler(Panel1_MouseDown);

            this.panel1.MouseMove += new MouseEventHandler(Panel1_MouseMove);

            this.panel1.MouseUp += new MouseEventHandler(Panel1_MouseUp);

            this.panel1.DoubleClick += new EventHandler(Panel1_DoubleClick);

            this.panel1.SetStyle(ControlStyles.OptimizedDoubleBuffer |

                                 ControlStyles.AllPaintingInWmPaint |

                                 ControlStyles.UserPaint, true);

            this.panel1.UpdateStyles();

        }

 

        private void Panel1_Paint(object sender, PaintEventArgs e)

        {

            foreach (var shape in shapes)

            {

                shape.Draw(e.Graphics);

            }

        }

 

        private void Panel1_MouseDown(object sender, MouseEventArgs e)

        {

            isDrawing = true;

            currentShape = new LineShape(lastPoint, e.Location);

            lastPoint = e.Location;

        }

 

        private void Panel1_MouseMove(object sender, MouseEventArgs e)

        {

            if (isDrawing)

            {

                if (currentShape is LineShape)

                {

                    currentShape = new LineShape(lastPoint, e.Location);

                }

                else if (currentShape is RectangleShape)

                {

                    Rectangle rect = ((RectangleShape)currentShape).Rectangle;

                    rect.Width = e.X - rect.X;

                    rect.Height = e.Y - rect.Y;

                    currentShape = new RectangleShape(rect);

                }

                else if (currentShape is EllipseShape)

                {

                    Rectangle rect = ((EllipseShape)currentShape).Rectangle;

                    int width = Math.Abs(e.X - rect.X);

                    int height = Math.Abs(e.Y - rect.Y);

                    Point center = new Point((rect.X + e.X) / 2, (rect.Y + e.Y) / 2);

                    rect = new Rectangle(center.X - width / 2, center.Y - height / 2, width, height);

                    currentShape = new EllipseShape(rect);

                }

 

                // Redraw the panel to show the current shape being drawn

                panel1.Invalidate();

            }

        }

 

        private void Panel1_MouseUp(object sender, MouseEventArgs e)

        {

            isDrawing = false;

            if (currentShape != null)

            {

                shapes.Add(currentShape);

                currentShape = null;

            }

        }

 

        private void Panel1_DoubleClick(object sender, EventArgs e)

        {

            // Clear the shapes list to erase the drawing board

            shapes.Clear();

            panel1.Invalidate();

        }

 

        // Abstract base class for shapes

        private abstract class Shape

        {

            public abstract void Draw(Graphics g);

        }

 

        // Line shape class

        private class LineShape : Shape

        {

            public Point StartPoint { get; private set; }

            public Point EndPoint { get; private set; }

 

            public LineShape(Point startPoint, Point endPoint)

            {

                StartPoint = startPoint;

                EndPoint = endPoint;

            }

 

            public override void Draw(Graphics g)

            {

                g.DrawLine(Pens.Black, StartPoint, EndPoint);

            }

        }

 

        // Rectangle shape class

        private class RectangleShape : Shape

        {

            public Rectangle Rectangle { get; private set; }

 

            public RectangleShape(Rectangle rectangle)

            {

                Rectangle = rectangle;

            }

 

            public override void Draw(Graphics g)

            {

                g.DrawRectangle(Pens.Black, Rectangle);

            }

        }

 

        // Ellipse shape class

        private class EllipseShape : Shape

        {

            public Rectangle Rectangle { get; private set; }

 

            public EllipseShape(Rectangle rectangle)

            {

                Rectangle = rectangle;

            }

 

            public override void Draw(Graphics g)

            {

                g.DrawEllipse(Pens.Black, Rectangle);

            }

        }

    }

}

 

3. 在Form1.Designer.cs中,确保你的Form1设计视图中有一个名为panel1的Panel控件,并调整其属性(如Dock设置为Fill)以匹配上述说明。此外,确保InitializeComponent方法中包含了对panel1的初始化代码。

 

4. 运行你的项目。现在,你应该能够在Panel上绘制线条、矩形和椭圆。双击Panel可以清除绘图板上的所有图形。

 

请注意,这个示例代码提供了基本的绘图功能,但你可以根据需要进行扩展和改进,例如添加更多的形状、颜色选择、线条粗细调整等功能。


http://www.mrgr.cn/news/70782.html

相关文章:

  • 【Linux】网络编程3
  • 基于Cocos Creator开发的打砖块游戏
  • Transformer(三):论文 Attention Is All You Need
  • 【数据结构】图的应用的时间复杂度
  • 前端开发中常见的ES6技术细节分享一
  • ubuntu主机搭建sysroot交叉编译环境
  • 【linux】CentOS 的软件源(Repository)学习
  • C++ | Leetcode C++题解之第559题N叉树的最大深度
  • 【Linux】获得同一子网下当前在线设备IP/Latency/MAC 通过nmap指定CIDR扫描当前在线设备
  • 启动QT时,出现找不到python27.dll的问题报错
  • 后端:Aop 面向切面编程
  • Springboot配置全局异常通用返回
  • Golang | Leetcode Golang题解之第559题N叉树的最大深度
  • 初识Linux · 共享内存
  • NRZ(Non-Return to Zero Code,非归零码),NRZI(Non-Return to Zero Inverted Code,非归零反转码)
  • SpringBoot(十三)SpringBoot配置webSocket
  • SIwave:在 SIwave 中释放计算频率扫描的强大功能
  • SpringBoot(八)使用AES库对字符串进行加密解密
  • 使用 ConstraintLayout 实现灵活的相对定位与偏移布局
  • 【Linux 31】网络层协议 - IP
  • CAN总线数据帧格式详细介绍
  • Java中的类和对象:深入理解面向对象编程的核心
  • Vagrant 没了 VirtualBox 的话可以配 Qemu
  • 第四十四章 Vue之actions/mapActions/getters
  • 51c大模型~合集23
  • Hadoop(YARN)