Windows Form Control에서 Graphics.clear는 제어 자체를 지 웁니다.이를 방지하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/10703678

문제

아래의 방법을 사용하여 그림 상자에 사용자 정의 선택 사각형을 그리려고합니다.

    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);
.

전체 그림 상자가 검은 색으로 바뀝니다.그러나 직사각형은 그 위에 그려집니다. 그 방법을 호출하지 않으면 직사각형은 물론 자체 스택합니다.이전 사각형을 제거하고 다음과 같이 새 사각형을 만듭니다.

누구든지 잘못된 것을 묘사 할 수 있습니까?

도움이 되었습니까?

해결책

OnPaintBackground 또는 OnPaint보다 다른 방법 내에 제어를 페인트하지 마십시오.

실제로 성능상의 이유로 필요할 수 있습니다 (귀하의 완전한 통제를 새로 고쳐주지 않을 것입니다.) 그러나 귀하의 코드를 훨씬 더 까다 롭게 할 것이고 항상 동일한 작업을 수행해야합니다.Paint 이벤트 내부의 작업도 (출력이 동일해야하므로 다른 많은 이유로 호출 될 수 있으므로)

Paint 내부에서 CreateGraphics를 사용할 필요조차하지 않아도 그래픽 컨텍스트는 PaintEventArgs 객체 안에 있으므로 코드를 다음과 같이 변경합니다.

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

CreateGraphics 메소드를 사용하도록 @andersforsgren을 지적하는 것은 일반적으로 호출 할 필요가 없습니다 (예 : 예를 들어, 자동화를 위해 그래픽을 기반으로 일부 계산을 수행해야합니다).).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top