Andy 胡

导航

C#绘图:带背景,拖鼠标画矩形和直线

基于

Visual Studio 2012

.net framework 4.5

 

效果截图:

 代码:

https://download.csdn.net/download/talkwah/10482880

 代码预览:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WFA画图
{
    public partial class Form1 : Form
    {
        #region 成员变量
        Point m_p1, m_p2;
        bool m_flgKeuDowm = false;
        Bitmap m_mapStart;
        Bitmap m_mapEnd;
        Bitmap m_mapInit;
        Graphics m_graphics;
        #endregion

        public Form1()
        {
            InitializeComponent();
            m_graphics = pictureBox1.CreateGraphics();
            
            // 最初的背景图存起来,清除绘制图形时用
            m_mapInit = (Bitmap)pictureBox1.BackgroundImage;
        }

        #region 鼠标事件
        /// <summary>
        /// 鼠标按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            m_flgKeuDowm = true;
            _initPoint(e);
            
        }
        
        /// <summary>
        /// 鼠标移动
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (!m_flgKeuDowm)
            {
                return;
            }
            else
            {
                m_p2 = new Point(e.X, e.Y);
            }

            int width = Math.Abs(e.X - m_p1.X);
            int height = Math.Abs(e.Y - m_p1.Y);


            _draw();
        }

        /// <summary>
        /// 鼠标抬起
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            m_flgKeuDowm = false;

            // 最终的图片设为背景图
            pictureBox1.BackgroundImage = m_mapEnd;

            // 起止点初始化
            _initPoint(e);
        }
        #endregion

        private void _draw(){

            // 每次的【终止图】都是取自【起始图】
            m_mapEnd = (Bitmap)m_mapStart.Clone();
            Graphics g = Graphics.FromImage(m_mapEnd);
            Pen pen = new Pen(Color.Red,3);
            if (rdoRect.Checked)
            {
                Point p1,p2;
                _swapPoint(out p1,out p2 );
                int width = Math.Abs(p2.X - p1.X);
                int height = Math.Abs(p2.Y - p1.Y);
                g.DrawRectangle(pen, p1.X, p1.Y, width, height);
            }else if(rdoLine.Checked){
                // 画直线不用转换点坐标,直接用成员变量的Point
                g.DrawLine(pen, m_p1, m_p2);
            }

            m_graphics.DrawImage(m_mapEnd, new Point(0, 0));
        }

        private void _initPoint(MouseEventArgs e)
        {
            m_p1 = new Point(e.X, e.Y);
            m_p2 = m_p1;

            if (pictureBox1.BackgroundImage != null)
            {
                m_mapStart = (Bitmap)pictureBox1.BackgroundImage;
            }
        }

        private void _printPoint(Point p)
        {
            Console.WriteLine(p.X+","+p.Y);
        }

        private void _swapPoint(out Point _p1, out Point _p2)
        {
            //实现画框随意翻转
            _p1 = m_p1;
            _p2 = m_p2;
            if (m_p1.X > m_p2.X)
            {
                int tmp = _p1.X;
                _p1.X = _p2.X;
                _p2.X = tmp;
            }
            if (m_p1.Y > m_p2.Y)
            {
                int tmp = _p1.Y;
                _p1.Y = _p2.Y;
                _p2.Y = tmp;
            }
        }

        #region 按钮
        private void btnClear_Click(object sender, EventArgs e)
        {
            pictureBox1.BackgroundImage = m_mapInit;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            // 保存
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.DefaultExt = "png";
            dlg.Filter = "Png Files|*.png";
            dlg.FileName = "截图";

            DialogResult dlgRet = dlg.ShowDialog();
            if (dlgRet == DialogResult.OK)
            {
                pictureBox1.BackgroundImage.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
            }
        }
        #endregion
    }
}

 

posted on 2018-06-17 00:04  talkwah  阅读(932)  评论(1编辑  收藏  举报