首页 新闻 会员 周边 捐助

winfrom 关于在picturebox上重绘缓慢问题 附源码

0
悬赏园豆:200 [已解决问题] 解决于 2021-02-24 16:37


这个是我要操作的图片,需要您把picturebox添加到一个form窗体中然后绑定以下事件

public Form2()
{
InitializeComponent();
}
Bitmap Ima = new Bitmap("b.jpg");
private void Form2_Load(object sender, EventArgs e)
{
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;

        pictureBox1.Image = Ima; pictureBox1.Location = new Point(0, 0);
         pictureBox1.Size = new Size(14000, 800); 
    }
    Point p1 = new Point(); Point p2 = new Point(); bool status = false;
     
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            p1 = new Point(e.X, e.Y); status = true;
        }
    }
    Rectangle rec = new Rectangle();
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        Point p2 = new Point(e.X, e.Y);
        if (p2.X < 0)
        {
            p2.X = 0;
        }
        if (p2.Y < 0)
        {
            p2.Y = 0;
        }
        if (p2.X > pictureBox1.Width)
        {
            p2.X = pictureBox1.Width;
        }
        if (p2.Y > pictureBox1.Height)
        {
            p2.Y = pictureBox1.Height;
        }
        if (p2.X > p1.X)
        {
            rec.X = p1.X;
            rec.Width = p2.X - p1.X;
        }
        else
        {
            rec.X = p2.X;
            rec.Width = p1.X - p2.X;
        }
        if (p2.Y > p1.Y)
        {
            rec.Y = p1.Y;
            rec.Height = p2.Y - p1.Y;
        }
        else
        {
            rec.Y = p2.Y; rec.Height = p1.Y - p2.Y;
        }
        this.Refresh();
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        if (status)
        {
            Graphics gg = e.Graphics;
            gg.DrawRectangle(new Pen(Color.Red, 2), rec);
        }
    }

以上是我的代码,出现重绘缓慢的是鼠标左键在控件中点击以下 然后拖动绘制矩形很慢跟不上鼠标的速度,我切换其它图片就没有问题,并且picturebox大小变成20000*800不存在这个问题

余道长的主页 余道长 | 初学一级 | 园豆:22
提问于:2021-02-24 15:34
< >
分享
最佳答案
0

如延迟(与上次处理时间比对进行延迟)Invalidate,或者MouseUp Invalidate;

不过按道理说这点消耗在GDI+ Frameworks 2.0后不存在。我怀疑你其他影响到“绘制性能”了,如用的this.Refresh(),你应该用pictureBox1.;甚至更小的区域做参数。

收获园豆:200
花飘水流兮 | 专家六级 |园豆:13617 | 2021-02-24 15:50

我尝试以下 麻烦您创建一个demo帮我也看看 谢谢您

余道长 | 园豆:22 (初学一级) | 2021-02-24 15:51

刚刚尝试了 没效果。。

余道长 | 园豆:22 (初学一级) | 2021-02-24 15:52

如果我把pictureBox1.Size改成 = new Size(20000, 800);他的绘制速度就跟得上我的鼠标就是正常的

余道长 | 园豆:22 (初学一级) | 2021-02-24 15:56

但是如果这样更改的话和需求不对应 没啥用 我还是得解决目前这个问题

余道长 | 园豆:22 (初学一级) | 2021-02-24 15:56

@余道长: 用pictureBox1.Invalidate(Rectangle())会好点。这种Demo MSDN是很多的(MS过去的SDK都有很详细的Demo),粘贴就有了。做控件样式现在很少用重绘,GDI+也顶多用在Bitmap上面,学习玩玩就行了。WPF数倍的开发效率,现在别个c++都玩Direct UI,想比GDI+的硬件加速,硬件利用率更高。

你这种写法也不对,既然只是画个矩形,干嘛在那么“重”的控件上画,反正你又不是画到Bitmap上,自己想想。你可以这么试,扔弃一切东西,直接在窗口或者只加一个Control(不要做任何操作)上绘制,如果还卡,应该机器可以扔了。

背景是类似天空的容器,图片比你这大很多,包含了一个图表(右下角就是Resize,是即时的),很正常。

花飘水流兮 | 园豆:13617 (专家六级) | 2021-02-24 16:09

@花飘水流兮: 我正在测试 没问题得话就你了

余道长 | 园豆:22 (初学一级) | 2021-02-24 16:24

有一定提升,谢谢了 我再研究研究

余道长 | 园豆:22 (初学一级) | 2021-02-24 16:36

@花飘水流兮: 我其实是画的矩形控件然后功能做完了 效果不是很理想 就这样弄得demo来测试得

余道长 | 园豆:22 (初学一级) | 2021-02-24 17:22
其他回答(1)
0

不要真的去绘制,定义一个空的 bitmap,在空的bitmap上画框,然后显示在picture上面就行
实际的bitmap很大,空的bitmap很小

jqw2009 | 园豆:2341 (老鸟四级) | 2021-02-24 16:40

那他能实现点击框可以拖动 修改大小吗?

支持(0) 反对(0) 余道长 | 园豆:22 (初学一级) | 2021-02-24 17:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册