当前位置: 代码迷 >> C# >> 有什么好点的步骤处理内存泄漏吗
  详细解决方案

有什么好点的步骤处理内存泄漏吗

热度:373   发布时间:2016-05-05 02:51:26.0
有什么好点的方法处理内存泄漏吗
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();这句可以释放,当时感觉频繁调用不太好
有什么更好的方法处理这里的问题吗
------解决思路----------------------
引用:
Quote: 引用:

你还是说清楚实际需求吧,我感觉没必要每次clone一张图片来做绘制,这做法很无稽;

就简单的绘制一个矩形,拖动鼠标的没一瞬间都要绘制一个矩形并擦除上一个矩形吧?第一次做绘图,不知道有什么好办法

...就知道是这样。。。
最简单的做法,搞个小的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);        //绘制矩形框
    }
}

弱弱的问一句 这就是你想要的效果吗?、、、、
  相关解决方案