拖动图片效果

对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#关于picturebox的用法
要在运行时显示或替换图片,可利用函数 LoadPicture 来设置 Picture 属性。提供图片文件名和可选路径名,由 LoadPicture 函数处理加载和显示图片的细节。
 
 picMain.Picture = LoadPicture("VANGOGH.BMP")

  PictureBox 控件具有 AutoSize 属性,当该属性设置为 True 时,PictureBox 能自动调整大小与显示的图片匹配。如果要用 AutoSize 属性设置为 True 的 PictureBox ,设计窗体时就需要特别小心。图片将不考虑窗体上的其它控件而调整大小,这可能导致意想不到的后果,如覆盖其它控件。设计时应通过加载每一幅图片来检查是否有这种现象发生。
使用它作为容器
  Picture box 控件也可以用作其它控件的容器。象 Frame 控件一样,可以在 PictureBox 控件上面加上其它控件。这些控件随 PictureBox 移动而移动,其 Top 和 Left 属性是相对 PictureBox 而言,而与窗体无关。
  PictureBox 容器的一种普通用法是 ToolBar 或 StatusBar 。可将 Image 控件置于这些容器中作为按钮或添加 Label 显示状态信息。将 Align 属性设置为 Top、Bottom、Left 或 Right ,PictureBox 将粘贴在窗体的边缘。
PictureBox 的其它用法
  PictureBox 控件有几种方法使 PictureBox 可用于其它目的。例如:把 PictureBox 看作是一块空画布,可以在它上面画画或打印,或者显示文本、图形,甚至是简单的动画。
  Print 方法允许向 PictureBox 控件输出文本,如同向打印机输出一样。有几种字体属性可以控制由 Print 方法输入的文本的特性;Cls 方法可以清除输出。
  Circle、Line、Point 和 Pset 方法可以用于在 PictureBox 中画图形。一些属性如 DrawWidth、FillColor 和 FillStyle 允许自定义图形的外观。
  用 PaintPicture 方法在图片控件内移动 Image 、并在几幅不同的 Image 间快速变化就能产生动画。

PictureBox 控件的主要作用是为用户显示图片。实际显示图片由 Picture 属性决定。Picture 属性包括被显示的图片的文件名(及可选的路径名)。

  注意 窗体对象也具有 Picture 属性,通过设置该属性可直接在窗体背景上显示图片。

你可能感兴趣的:(图片)