Почему FillPolygon не рисует после FillRectangle? - PullRequest
0 голосов
/ 24 апреля 2011

Я рисую прямо на форме с помощью двух операторов FillPolygon, чтобы создать две стрелки - одну черную, одну белую. (Белая стрелка немного меньше и нарисована над черной стрелкой.)

Вот код в форме OnPaint.

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    g.FillPolygon(brushBlack, travelArrow);
    g.FillPolygon(brushWhite, featureArrow);
}

Отлично работает. Теперь, когда белая стрелка будет рисоваться несколько раз в разных поворотах, я решил использовать двойную буферизацию, чтобы избежать как можно большего мерцания.

Сначала я создал метод DrawFeatureArrow, который я вызываю в OnPaint.

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;

    g.FillPolygon(brushBlack, travelArrow);
    DrawFeatureArrow(this, e);
}

Примечание: пока нет вращения белой кодированной стрелки, я просто пытаюсь настроить двойную буферизацию.

DrawFeatureArrow выглядит следующим образом.

private void DrawFeatureArrow(object sender, PaintEventArgs e)
{
    Bitmap buffer = new Bitmap(60, 159);
    Graphics gOff = Graphics.FromImage(buffer);

    gOff.FillRectangle(brushGreen, 0, 0, buffer.Width, buffer.Height);
    gOff.FillPolygon(brushWhite, featureArrow);

    ImageAttributes attr = new ImageAttributes();
    attr.SetColorKey(Color.Green, Color.Green);

    Rectangle srcRect = new Rectangle(0, 0, bugger.Width, buffer.Height);
    Rectangle destRect = new Rectangle(90, 66, 60, 159);

    Graphics f = e.Graphics;

    // Should draw green rectangle and white arrow
    f.DrawImage(buffer, 90, 66);  // Draws just a green rectangle

    // If uncommented, should draw just white arrow (green rectangle hidden by SetColorKey)
    // f.DrawImage(buffer, destRect, 0, 0, buffer.Width, buffer.Height, GraphicsUnit.Pixel, attr); 

    f.Dispose();
    gOff.Dispose();
    buffer.Dispose();
}

При запуске отображается зеленый прямоугольник, но не белая стрелка.

Как ни странно, в DrawFeatureArrow, если вы замените это

gOff.FillPolygon(brushWhite, featureArrow);

С этим

gOff.FillRectangle(brushWhite, 10, 10, 20, 20);

Вы видите крошечный белый прямоугольник в верхнем левом углу зеленого прямоугольника.

Очень странное поведение. Надеюсь, кто-то может указать, что я делаю неправильно.

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 24 апреля 2011

Вы рисуете стрелку объекта над буфером, который имеет размеры 60, 159. Возможно, расположение стрелки объекта находится за пределами этих размеров и поэтому не заканчивается в растровом изображении.

...