如题,已开启了双缓冲,作用不大!仅仅只是改变了picturebox的坐标!picturebox背景设置为了Transparent。哪位大神有解决办法么!
移动代码:
private void _moveImg_MouseMove(object sender, MouseEventArgs e)
{
if (this.IsImgMove) // 移动状态
{
int newX, newY;
newX = _moveImg.Left + e.X - this.MouseMoveStartX;
newY = _moveImg.Top + e.Y - this.MouseMoveStartY;
_moveImg.Location = new Point(newX, newY);
}
}
实现双缓冲, 应该就不会闪了。
说了哇,form已经开启了双缓冲!有一点效果!
@chenhp: show代码
@问天何必: 已贴代码!
form中启用双缓冲是没有用的,需要自己弄一个bitmap,然后画在这个bitmap上面,最后将picturebox的image属性设为bitmap,然后你试试,估计就不会闪烁了
将picturebox封装成usercontrol,移动usercontrol就不会闪了,试试吧
有必要做这么复杂么。。。
@chenhp: 很复杂吗,这个世界什么简单?什么复杂?能解决问题就行
@上帝之城: 。。。。。。。闪得原因是重绘,usercontrol怎么就不会闪呢!!还有form的背景图片也是导致闪烁的原因!!!
@chenhp: 要深究这些问题,只有去看源代码了。
@上帝之城: 。。。。
这个闪烁和双缓存没有半毛钱的关系!我已找到问题症结。就是PictureBox1_MouseMove 中 e.X ,e.Y 坐标是相对于PictureBox1 控件的坐标,而不是整个窗体或屏幕的坐标。如果这时你移动了PictureBox1, 自然就会闪烁。
解决方法如下:
Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown flag = 1 x1 = e.X y1 = e.Y '转换坐标为 Form 坐标 x1 = x1 + PictureBox1.Left y1 = y1 + PictureBox1.Top End Sub Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If flag = 0 Then Exit Sub Else x2 = e.X y2 = e.Y '这样会闪烁,因为e.X ,e.Y 坐标是相对于PictureBox1 控件的坐标,因为来自于PictureBox1_MouseMove 而不是Form_MouseMove 'PictureBox1.Left = PictureBox1.Left + (x2 - x1) 'PictureBox1.Top = PictureBox1.Top + (y2 - y1) 'x1 = x2 'y1 = y2 '转换坐标为 Form 坐标 x2 = x2 + PictureBox1.Left y2 = y2 + PictureBox1.Top PictureBox1.Left = PictureBox1.Left + (x2 - x1) PictureBox1.Top = PictureBox1.Top + (y2 - y1) x1 = x2 y1 = y2 End If ' Me.Text = x1.ToString + "|" + y1.ToString + "|" + x2.ToString + "|" + y2.ToString End Sub Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp flag = 0 PictureBox1.Refresh() End Sub
试了,感觉差不多啊!
FORM的属性 DoubleBufferd 改为true,此后再添加picturebox,实现加载,就不闪烁了
2年前的问题。。。前面已经有人说了添加双缓冲没用
@chenhp: 三年了。。。
@chenhp:
这样写一套,加上已说过的双缓冲,不闪烁。。。
Boolean moveflag;
int xpos, ypos; //picture1
private void mousemove(object sender, MouseEventArgs e)
{
if (moveflag)
{
pictureBox1.Left += Convert.ToInt16(e.X - xpos);//设置x坐标.
pictureBox1.Top += Convert.ToInt16(e.Y - ypos);//设置y坐标
}
}
private void mousedown(object sender, MouseEventArgs e)
{
moveflag = true;//已经按下.
xpos = e.X;//当前x坐标.
ypos = e.Y;//当前y坐标.
}
private void mouseup(object sender, MouseEventArgs e)
{
moveflag = false;
}
@小微笑: 试看看
四年了。。。嘿嘿嘿
都四年了,终于找到办法了。
其实很简单,双缓冲加一个timer 1s定时刷下父类界面就好了。