首页 新闻 搜索 专区 学院

在winform上移动picturebox控件会出现闪烁!

0
悬赏园豆:30 [待解决问题]

如题,已开启了双缓冲,作用不大!仅仅只是改变了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);

 

}
}

chenhp的主页 chenhp | 初学一级 | 园豆:9
提问于:2015-02-10 10:56
< >
分享
所有回答(7)
0

实现双缓冲, 应该就不会闪了。 

问天何必 | 园豆:3311 (老鸟四级) | 2015-02-10 11:29

说了哇,form已经开启了双缓冲!有一点效果!

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2015-02-10 11:34

@chenhp: show代码

支持(0) 反对(0) 问天何必 | 园豆:3311 (老鸟四级) | 2015-02-10 11:35

@问天何必: 已贴代码!

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2015-02-10 11:40
0

form中启用双缓冲是没有用的,需要自己弄一个bitmap,然后画在这个bitmap上面,最后将picturebox的image属性设为bitmap,然后你试试,估计就不会闪烁了

刘宏玺 | 园豆:14020 (专家六级) | 2015-02-10 20:42
0

将picturebox封装成usercontrol,移动usercontrol就不会闪了,试试吧

上帝之城 | 园豆:2549 (老鸟四级) | 2015-02-10 23:03

有必要做这么复杂么。。。

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2015-02-12 16:08

@chenhp: 很复杂吗,这个世界什么简单?什么复杂?能解决问题就行

支持(0) 反对(0) 上帝之城 | 园豆:2549 (老鸟四级) | 2015-02-12 18:40

@上帝之城: 。。。。。。。闪得原因是重绘,usercontrol怎么就不会闪呢!!还有form的背景图片也是导致闪烁的原因!!!

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2015-02-13 09:28

@chenhp: 要深究这些问题,只有去看源代码了。

支持(0) 反对(0) 上帝之城 | 园豆:2549 (老鸟四级) | 2015-02-13 09:32

@上帝之城: 。。。。

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2015-02-13 09:39
0

这个闪烁和双缓存没有半毛钱的关系!我已找到问题症结。就是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

 

romao | 园豆:202 (菜鸟二级) | 2016-07-24 14:47

试了,感觉差不多啊!

支持(1) 反对(0) chenhp | 园豆:9 (初学一级) | 2016-07-25 10:33
1

FORM的属性 DoubleBufferd 改为true,此后再添加picturebox,实现加载,就不闪烁了

青鸾丢丢丢 | 园豆:202 (菜鸟二级) | 2018-10-17 10:12

2年前的问题。。。前面已经有人说了添加双缓冲没用

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2018-10-17 10:14

@chenhp: 三年了。。。

支持(1) 反对(0) 青鸾丢丢丢 | 园豆:202 (菜鸟二级) | 2018-10-17 14:15

@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;
}

支持(1) 反对(0) 青鸾丢丢丢 | 园豆:202 (菜鸟二级) | 2018-10-17 14:49

@小微笑: 试看看

支持(1) 反对(0) chenhp | 园豆:9 (初学一级) | 2018-10-17 14:56
0

四年了。。。嘿嘿嘿

lvyeRose | 园豆:202 (菜鸟二级) | 2019-08-12 17:51
0

都四年了,终于找到办法了。
其实很简单,双缓冲加一个timer 1s定时刷下父类界面就好了。

倒灌人生 | 园豆:202 (菜鸟二级) | 2019-10-12 16:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册