日期:2014-05-18 浏览次数:20914 次
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private Point sp = new Point(0, 0); private Point ep = new Point(0, 0); private bool d1 = false; private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (!d1) { sp=new Point(e.X,e.Y); ep=new Point(e.X,e.Y); } d1 = !d1; } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (!d1) { return; } ep = new Point(e.X, e.Y); this.pictureBox1.Refresh(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { ColorDialog cd = new ColorDialog(); if (cd.ShowDialog() == DialogResult.OK) { MessageBox.Show(cd.Color.Name); } Pen pen1 = new Pen(cd, 3); if (sp.Equals(ep)) return; int a = ep.Y - sp.Y; int b = ep.X - sp.X; e.Graphics.DrawRectangle(pen1, sp.X,sp.Y,b,a); } } }
using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace CommonPlatform { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private Point sp = Point.Empty; private List<object[]> rects = new List<object[]>(); private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { this.sp = e.Location; } private void pictureBox1_Paint(object sender, PaintEventArgs e) { foreach (var item in this.rects) { Rectangle r = (Rectangle)item[0]; Color c = (Color)item[1]; e.Graphics.DrawRectangle(new Pen(c), r); } } private void pictureBox1_MouseUp(object sender, MouseEventArgs e) { if (sp.IsEmpty && sp == e.Location) { return; } int x = e.X > sp.X ? sp.X : e.X; int y = e.Y > sp.Y ? sp.Y : e.Y; int width = Math.Abs(sp.X - e.X); int height = Math.Abs(sp.Y - e.Y); ColorDialog dialog = new ColorDialog(); dialog.ShowDialog(this); this.rects.Add(new object[] { new Rectangle(x, y, width, height), dialog.Color }); this.pictureBox1.Invalidate(); this.sp = Point.Empty; } } }
------解决方案--------------------
不要跟踪OnPaint事件,直接在mousemove事件中做几件事:
1.invalidate鼠标上次经过的点与sp形成的矩形;
2.绘制由当前鼠标坐标与sp形成的新矩形