我做一个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 =false;int x=0,y=0;为pictureBox2控件事件OnMouseDown,OnMouseUp,OnMouseMove增加事件处理函数如下:
private void pictureBox2_MouseDown(object sender,//鼠标按下事件处理函数
System.Windows.Forms.MouseEventArgs e)
{ =true;
x=e.X;
y=e.Y;
}
126
private void pictureBox2_MouseMove(object sender,//鼠标移动事件处理函数
System.Windows.Forms.MouseEventArgs e)
{ if()
{ 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)
{ =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外,单击鼠标,图形固定到指定位置。

解决方案 »

  1.   


    if ()
    {
        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);
    }
      

  2.   

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

  3.   

    { if()
    { 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;
    //原来是这两句作怪!
    }问题解决了,谢谢!
    但是为什么加了x=e.X;
    y=e.Y;
    就会造成抖动呢?
      

  4.   

    e.X, e.Y 是在 MouseMove 时获取的鼠标位置而 x, y 是在 MouseDown 时获取的鼠标位置
    那么 x, y 也可以看作是鼠标与 pictureBox2 对象的 Left 和 Top 之间的距离当鼠标移动时,对象的 Left 和 Top 要根据鼠标位置发生变化
    但鼠标 和 pictureBox2 对象的 Left 和 Top 之间的距离却要保持不变所以 x, y 也不能改变, 那么新的 Left 和 Top 就是x1 = pictureBox2.Left + e.X - x;
    y1 = pictureBox2.Top + e.Y - y;