为什么 FillPolygon 在 FillRectangle 之后不绘制?

发布于 2024-11-03 06:17:44 字数 1907 浏览 0 评论 0原文

我直接在带有两个 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);

您会在绿色矩形的左上角看到一个白色的小矩形。

非常奇怪的行为。希望有人能指出我做错了什么。

预先感谢您的帮助。

I'm drawing directly onto a form with two FillPolygon statements to create two arrows - one black, one white. (The white arrow is slightly smaller and drawn over the black arrow.)

Here's the code in the form's OnPaint.

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

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

Works great. Now since the white arrow is going to be drawn several times in different rotations, I decided to use double-buffering to avoid as much flicker as possible.

I first created a DrawFeatureArrow method that I call in OnPaint.

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

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

Note: There's no rotation of the white arrow coded yet, I'm just trying to get the double-buffering set up.

DrawFeatureArrow looks like this.

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();
}

When run, the green rectangle is drawn but not the white arrow.

Strangely enough, in DrawFeatureArrow, if you replace this

gOff.FillPolygon(brushWhite, featureArrow);

With this

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

You get a tiny white rectangle in the upper left of the green rectangle.

Very strange behavior. Hope someone can point out what I'm doing incorrectly.

Thanks in advance for the help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雪落纷纷 2024-11-10 06:17:44

您正在尺寸为 60、159 的缓冲区上绘制特征箭头。也许特征箭头的位置在这些尺寸之外,因此并未在位图中结束。

You're drawing your feature arrow over buffer that has dimensions of 60, 159. Maybe the location of the feature arrow is outside of those dimensions and therefore did not end in the bitmap.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文