0

我尝试使用以下方法在 Picturebox 上绘制自定义选择矩形:

    void _drag_UpdateView(bool clearOnly, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("UpdateView");
        using (Graphics g = this.i_rendered.CreateGraphics())
        {
            g.Clear(Color.Transparent);
            if (clearOnly)
                return;
            int px = (_drag_start.X > e.Location.X)?e.Location.X:_drag_start.X;
            int py = (_drag_start.Y > e.Location.Y)?e.Location.Y:_drag_start.Y;
            if (px < 0)
                px = 0;
            if (py < 0)
                py = 0;
            int wx = Math.Abs(e.Location.X-_drag_start.X);
            int wy = Math.Abs(e.Location.Y-_drag_start.Y);
            g.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
        }
    }

每当我打电话时:

g.Clear(Color.Transparent);

整个图片框变黑。但是,矩形被绘制在它上面。如果我不调用该方法,那么矩形当然会自行堆叠。我想删除旧的矩形并创建一个这样的新矩形。

谁能描述什么是错的?

4

1 回答 1

1

不要在除OnPaintBackgroundor之外的任何其他方法中绘制控件OnPaint

实际上,出于性能原因,您可能需要它(您不会刷新完全控制,只是即时更改某些内容),但它会使您的代码更加棘手,并且您总是需要在Paint事件(因为它可能由于许多其他原因被调用,所以输出应该是相同的)。

Paint您甚至不需要使用CreateGraphics的内部,图形上下文位于PaintEventArgs对象内部,因此将代码更改为:

void DoPainting(object sender, PaintEventArgs e)
{
    // Do your calculations
    e.Graphics.DrawRectangle(Pens.LightBlue, px, py, wx, wy);
}

正如@AndersForsgren 所指出的那样,使用该CreateGraphics方法并不常见,通常您不需要调用它(除了之前指出的例外情况,例如,您需要根据 AutoSize 等图形执行一些计算)。

于 2012-05-22T15:37:53.677 回答