Picturebox刷新C#而不重绘当前图形

时间:2016-03-19 19:07:55

标签: c# picturebox transparent

我在网上找到了这个代码,我想用它在我的绘图上画一个小蓝框。但是当我点击图片框时会出现蓝框,但是它重绘了我的整个图片框,这是一个问题,因为我有一个非常复杂的图片,而且需要几秒钟才能重绘。 Invalidate有什么办法吗?也许是一个图片框里面的图片框,backpicturebox是我复杂的绘图,而frontpicturebox是蓝色框的刷新?我似乎无法让前面的picturebox backgroundcolor透明,任何人都可以帮助我吗?

private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
    // Determine the initial rectangle coordinates...
    if (MeasureMentimported && !selectieBezig)
    {
        RectStartPoint = e.Location;
        //Invalidate();
        selectieBezig = true;
    }
}

// Draw Rectangle
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    //Als er niet links wordt geklikt, dan gewoon weer terug.
    if (e.Button != MouseButtons.Left)
        return;

    //Alleen als de measurementfile is geladen, gaan we kijken of er iets te selecteren valt.
    if (MeasureMentimported && selectieBezig)
    {
        Point tempEndPoint = e.Location;
        int X1 = Math.Min(RectStartPoint.X, tempEndPoint.X);
        int Y1 = Math.Min(RectStartPoint.Y, tempEndPoint.Y);
        int X2 = Math.Max(RectStartPoint.X, tempEndPoint.X);
        int Y2 = Math.Max(RectStartPoint.Y, tempEndPoint.Y);

        Rect.Location = new Point(X1, Y1);
        Rect.Size = new Size(X2 - X1, Y2 - Y1);

        picTekenvlak.Invalidate();

        //Rect.Location = new Point(
        //    Math.Min(RectStartPoint.X, tempEndPoint.X),
        //    Math.Min(0, 1000));
        //Rect.Size = new Size(
        //    Math.Abs(RectStartPoint.X - tempEndPoint.X),
        //    Math.Abs(1000));
        // MessageBox.Show("k");
    }
}

// Draw Area
//
private void pictureBox1_Paint1(object sender, System.Windows.Forms.PaintEventArgs e)
{
    if (MeasureMentimported)
    {
        if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
        {
            e.Graphics.FillRectangle(selectionBrush, Rect);
        }
    }
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
    selectieBezig = false;
    if (e.Button == MouseButtons.Right)
    {
        if (Rect.Contains(e.Location))
        {
            Console.WriteLine("Right click");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

OnPaint事件会发送一个PaintEventArgs对象,该对象根据PaintEventArgs.ClipRectangle描述重绘的次数。您可以通过在调用Invalidate

中发送蓝色矩形的坐标来控制它

然后,您需要使用这些坐标来确定重绘的程度。这也会减少您的应用程序对任何类型的叠加所做的数量,例如在PictureBox上拖动另一个应用程序等。

您可能想尝试将复杂图像绘制到Bitmap,然后将该位图指定给PictureBox.Image。我不知道这是否会起作用,因为您直接在PictureBox图像表面上绘图,但是如果您可以使其工作,Windows将处理裁剪以为您渲染图像,这是理想的。