C#双缓冲技术实例详解

2019-12-26 18:07:18于丽

至此,双缓冲问题解决,两种方式的实现效果都一样,但最后一种方式的占有的内存很少,不会出现内存泄露!

接下来是对acdsee拖动图片效果的实现。开始不懂双缓冲,以为双缓冲可以解决这个问题,结果发现使用了双缓冲没啥效果,请教了高人,然后修改了些代码,完成这个效果。

图片是在pictureBox1里。


Bitmap currentMap;
bool first = true;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
  if (zoom == 0)
  {
    if (e.Button == MouseButtons.Left) //dragging
      mousedrag = e.Location;
    Image myImage = myMap.GetMap();
    currentMap = new Bitmap(myImage);
    first = false;
  }
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
  if (zoom == 0&&!first)
  {
      Image img = new Bitmap(Size.Width, Size.Height);
      Graphics g = Graphics.FromImage(img);
      g.Clear(Color.Transparent);//图片移动后显示的底色
      g.SmoothingMode = SmoothingMode.HighQuality; //高质量
      g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量
      g.DrawImageUnscaled(currentMap, new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y));//在g中移动图片,原图在(0,0)画的,所以直接用new System.Drawing.Point(e.Location.X - mousedrag.X, e.Location.Y - mousedrag.Y)就好。
      g.Dispose();
      pictureBox1.Image = img;//img是在鼠标这个位置时生成被移动后的暂时的图片
  }
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
  if (zoom == 0)
  {
    System.Drawing.Point pnt = new System.Drawing.Point(Width / 2 + (mousedrag.X - e.Location.X),
    Height / 2 + (mousedrag.Y - e.Location.Y));
    myMap.Center = myMap.ImageToWorld(pnt);
    pictureBox1.Image = myMap.GetMap();
    first = true;
  }
}

说说思路,在鼠标点下时创建一个bitmap,currentMap,用它来存放当前图像。鼠标移动时,根据鼠标位置画图,最后,鼠标up时,重新画图。



注:相关教程知识阅读请移步到c#教程频道。