private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
endPoint = e.Location;
//确保鼠标移动过程中只保留鼠标最后一次移动的轨迹
backupImg = (Image)sourceImg.Clone();
//GC.Collect();
graphics = Graphics.FromImage(backupImg);
...
}
执行 backupImg = (Image)sourceImg.Clone();这句的时候会导致大量的内存占用
GC.Collect();这句可以释放,当时感觉频繁调用不太好
有什么更好的方法处理这里的问题吗
------解决思路----------------------
...就知道是这样。。。
最简单的做法,搞个小的picturebox,里面放张图比如你的矩形,当鼠标进入你的pictureBox1时,将那小picturebox显示在鼠标位置,且鼠标移动时,重置小picturebox的位置来跟随鼠标
既然你说你没怎么做过绘制就不给你说这里怎么Invalidate怎么绘制了,直接用上面那方法吧;省时省力,而且不用你去考虑怎么双缓冲,怎么优化绘制区域
------解决思路----------------------
public partial class Form2 : Form
{
public Form2() {
InitializeComponent();
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
}
private Point m_pt; //初始点击位置
private Rectangle m_rect; //需要绘制的矩形框
protected override void OnMouseDown(MouseEventArgs e) {
m_pt = e.Location; //获得初始位置
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
m_rect.X = m_pt.X < e.X ? m_pt.X : e.X;
m_rect.Y = m_pt.Y < e.Y ? m_pt.Y : e.Y;
m_rect.Width = Math.Abs(e.X - m_pt.X);
m_rect.Height = Math.Abs(e.Y - m_pt.Y);
this.Invalidate(); //设置矩形框 并且重绘
}
base.OnMouseMove(e);
}
protected override void OnPaint(PaintEventArgs e) {
e.Graphics.DrawRectangle(Pens.Cyan, m_rect);
base.OnPaint(e); //绘制矩形框
}
}
弱弱的问一句 这就是你想要的效果吗?、、、、