在winforms / C#中使用graphics.drawline时滞后

时间:2013-02-12 19:58:04

标签: c# winforms graphics picturebox

初学者编码器进入C#..我正在制作一个涉及绘画的程序。基本上每当我移动我的鼠标进行绘制时,图像上的实际线条显示为延迟 - 并且它比实际应用的更直接。它过去工作正常,但在某些时候我猜错了 - 不记得我当时做了什么所以很难回溯..我试图在一个新的解决方案中复制程序的绘图部分,并且它似乎工作正常..

我发布了.exe文件,你可以看到我的意思,但我不确定是否允许我们在这里发布可执行文件。

编辑:我已经确认代码工作正常,请查看sa_ddam213的答案以获取代码示例。好像它在其他人的计算机上工作正常,所以我完全糊涂了。

3 个答案:

答案 0 :(得分:1)

Yo正在为每个鼠标移动事件创建一个新的Graphic和Pen对象,这比在Mouse_Down事件中创建这些变量要慢很多。

这样的事情可能会快一点。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        b = new Bitmap(this.Width, this.Height);
    }

    private Graphics _graphics;
    private Pen _pen;
    private int pX = 0;
    private int pY = 0;
    private bool paint = false;
    private Bitmap b;

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        pX = e.X;
        pY = e.Y;
        _graphics = Graphics.FromImage(b);
        _pen= new Pen(Color.Black, 3);
        paint = true;
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (paint)
        {
            _graphics.DrawLine(_pen, pX, pY, e.X, e.Y);
            pictureBox1.BackgroundImage = b;
            pictureBox1.Refresh();
            pX = e.X;
            pY = e.Y;
        }
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {
        paint = false;
        _graphics.Dispose();
        _pen.Dispose();
    }
}

答案 1 :(得分:0)

尝试使用pictureBox1.Refresh()

而不是pictureBox1.Invalidate()

您可能还需要在pictureBox1.BackgroundImage = b

之后移动它

此外,在MouseDown中,您需要设置 this.Capture = true,并且在MouseUp中您应该设置 this.Capture = false 。如果你不这样做,当你的鼠标光标在不同的应用程序上时释放鼠标按钮,你的永远不会收到MouseUp消息。

答案 2 :(得分:0)

可能是你的VGA出了问题。请与另一台PC联系并告知我们