C# 画线 Draw a Line

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 BCSVClient
{
  /// <summary>
    /// 窗口定义
    /// </summary>
    public partial class LineTest : Form
    {
        public LineTest()
        {
            drawPanel.BackColor = Color.White;
            drawPanel.Cursor = Cursors.Cross;
            drawPanel.Dock = DockStyle.Fill;
            drawPanel.MouseDown += new MouseEventHandler(drawPanel_MouseDown);
            drawPanel.MouseUp += new MouseEventHandler(drawPanel_MouseUp);
            drawPanel.MouseMove += new MouseEventHandler(drawPanel_MouseMove);
            drawPanel.Paint += new PaintEventHandler(drawPanel_Paint);
            Controls.Add(drawPanel);
        }
        /// <summary>
        /// 线条对象
        /// </summary>
        class Line
        {
            /// <summary>
            /// 建立线条对象,并设置起点
            /// </summary>
            /// <param name="startPoint">此线条的起点</param>
            public Line(Point startPoint)
            {
                StartPoint = startPoint;
                EndPoint = startPoint;
            }
            public Point StartPoint = Point.Empty;
            public Point EndPoint = Point.Empty;
        }

        public class DrawPanel : Control
        {
            public DrawPanel()
            {
                this.DoubleBuffered = true;
                this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true);
            }
        }
        /// <summary>
        /// 用于保存绘出线条的集合
        /// </summary>
        private List<Line> lines = new List<Line>();

        /// <summary>
        /// 用于保存当前正在绘制的线条
        /// </summary>
        private Line drawingLine = null;

        /// <summary>
        /// 用于显示绘图的面板组件
        /// </summary>
        private DrawPanel drawPanel = new DrawPanel();

        /// <summary>
        /// 在绘图区释放鼠标,结束当前线条绘制
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void drawPanel_MouseUp(object sender, MouseEventArgs e)
        {
            if (drawingLine == null) return;
            drawingLine.EndPoint = e.Location;
            drawingLine = null;
        }

        /// <summary>
        /// 在绘图区按下鼠标,开始绘制新线条
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void drawPanel_MouseDown(object sender, MouseEventArgs e)
        {
            drawingLine = new Line(e.Location);
            lines.Add(drawingLine);
        }

        /// <summary>
        /// 在绘图区移动鼠标时,如果正在绘制新线条,就更新绘制面板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void drawPanel_MouseMove(object sender, MouseEventArgs e)
        {
            if (drawingLine != null)
            {
                drawingLine.EndPoint = e.Location;
                drawPanel.Invalidate();
            }
        }

        /// <summary>
        /// 绘制效果到面板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void drawPanel_Paint(object sender, PaintEventArgs e)
        {
            Bitmap bp = new Bitmap(drawPanel.Width, drawPanel.Height); // 用于缓冲输出的位图对象
            Graphics g = Graphics.FromImage(bp);

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 消锯齿(可选项)

            Pen p = new Pen(Color.Black);
            foreach (Line line in lines)
            {
                if (line == drawingLine)
                {
                    // 当前绘制的线条是正在鼠标定位的线条
                    p.Color = Color.Blue;
                }
                else
                {
                    p.Color = Color.Black;
                }
                g.DrawLine(p, line.StartPoint, line.EndPoint);
            }
            // 将缓冲位图绘制到输出
            e.Graphics.DrawImage(bp, Point.Empty);
        }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值