日期:2014-05-18  浏览次数:21185 次

拖动picturebox时 图像抖动
我做一个picturebox剪贴板,在拖动picturebox时,picturebox里个图像抖动,怎么解决这个问题呢?

我是按书上这个例子做的:

         剪贴板粘贴功能的实现


(7) 为主窗体菜单"编辑"|"粘贴"菜单项增加单击事件处理函数如下:
private void menuItemPaste_Click(object sender, System.EventArgs e)
{ IDataObject iData=Clipboard.GetDataObject();//得到剪贴板对象
if(iData.GetDataPresent(DataFormats.Bitmap))//判断剪贴板有无位图对象
{ Bitmap bits=(Bitmap)iData.GetData(DataFormats.Bitmap);//得到剪贴板位图
Bitmap myBitmap=new Bitmap(pictureBox1.Image);
Graphics g=Graphics.FromImage(myBitmap);
g.DrawImage(bits,30,30);//粘贴图形左上角到坐标(30,30)位置
pictureBox1.Image=myBitmap;//位图对象在pictureBox1中显示
}
}
(8) 运行Windows画图程序,拷贝图形到剪贴板。运行自己编制的程序,单击菜单"编辑"|"粘贴"菜单项,可以看到画图程序中被拷贝的图形能正确粘贴到自己编制

的程序中。
(9) Windows画图程序粘贴后,能用鼠标拖动粘贴的图形,现实现此功能。放PictureBox控件到窗体,属性Name=pictureBox2,属性Visable=false。将把粘贴后的

图形放到PictureBox2中,使其移动。为Form1类增加变量:bool mark=false;int x=0,y=0;为pictureBox2控件事件OnMouseDown,OnMouseUp,OnMouseMove增加事

件处理函数如下:
private void pictureBox2_MouseDown(object sender,//鼠标按下事件处理函数
System.Windows.Forms.MouseEventArgs e)
{ mark=true;
x=e.X;
y=e.Y;
}
126
private void pictureBox2_MouseMove(object sender,//鼠标移动事件处理函数
System.Windows.Forms.MouseEventArgs e)
{ if(mark)
{ int x1,y1;
x1=e.X-x;
y1=e.Y-y;
pictureBox1.Invalidate();//擦除上次鼠标移动时画的图形
pictureBox1.Update();//立即重画,即擦除
pictureBox2.Left+=x1;//效果是拖动pictureBox2随鼠标移动
pictureBox2.Top+=y1;
x=e.X;
y=e.Y;
}
}
private void pictureBox2_MouseUp(object sender,
System.Windows.Forms.MouseEventArgs e)
{ mark=false;}
(10) 修改主窗体菜单项粘贴单击事件处理函数如下:
private void menuItemPaste_Click(object sender,System.EventArgs e)
{ IDataObject iData=Clipboard.GetDataObject();
if(iData.GetDataPresent(DataFormats.Bitmap))
{ Bitmap bit=(Bitmap)iData.GetData(DataFormats.Bitmap); pictureBox2.Width=bit.Width;//阴影为修改部分 pictureBox2.Height=bit.Height;

pictureBox2.Image=bit; pictureBox2.Top=pictureBox1.Top; pictureBox2.Left=pictureBox1.Left; pictureBox2.Parent=pictureBox1;

pictureBox2.Visible=true;
}
}
(11) 在pictureBox1控件任意位置单击鼠标,表示已将粘贴图像拖到指定位置,需将粘贴图像粘贴到pictureBox1控件。为pictureBox1控件的事件OnMouseDown增

加事件函数如下:
private void pictureBox1_MouseDown(object sender,
System.Windows.Forms.MouseEventArgs e)
{ if(pictureBox2.Image!=null&&pictureBox2.Visible)
{ Bitmap bits=new Bitmap(pictureBox2.Image);
Bitmap myBitmap = new Bitmap(pictureBox1.Image);
Graphics g=Graphics.FromImage(myBitmap);
g.DrawImage(bits,pictureBox2.Left,pictureBox2.Top);
pictureBox1.Image=myBitmap;//位图对象在pictureBox1中显示
pictureBox2.Visible=false;
}
}
127
(12) 运行Windows画图程序,拷贝图形到剪贴板。运行自己编制的程序,单击菜单"编辑"|"粘贴"菜单项,可以看到画图程序中被拷贝的图形能正确粘贴到自己编

制的程序中。拖动被拷贝的图形,使其运动到指定位置,在pictureBox2外,单击鼠标,图形固定到指定位置。

------解决方案--------------------
C# code

if (mark)
{
    int x1, y1;
    x1 = this.pictureBox2.Left + e.X - x;
    y1 = this.pictureBox2.Top + e.Y - y;

    pictureBox1.Invalidate(); //擦除上次鼠标移动时画的图形
    pictureBox1.Update(); //立即重画,即擦除

    this.pictureBox2.Location = new Point(x1, y1);
}

------解决方案--------------------
双缓冲技术
http://topic.csdn.net/u/20080415/19/25f82626-ddc4-4f38-9e32-ce91886bafa6.html