FillRectangle之后为什么不绘制FillPolygon?

时间:2011-04-24 13:39:16

标签: c# .net winforms gdi+ system.drawing

我直接在带有两个FillPolygon语句的表单上绘制,以创建两个箭头 - 一个黑色,一个白色。 (白色箭头略小,并在黑色箭头上绘制。)

以下是OnPaint表单中的代码。

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

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

效果很好。现在,由于白色箭头将以不同的旋转方式绘制几次,我决定使用双缓冲来避免尽可能多的闪烁。

我首先创建了一个我在OnPaint中调用的DrawFeatureArrow方法。

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 :(得分:0)

您正在尺寸为60,159的缓冲区上绘制特征箭头。也许特征箭头的位置超出了这些尺寸,因此不会在位图中结束。