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 } }