gpt4 book ai didi

c# - 双缓冲 C#

转载 作者:太空狗 更新时间:2023-10-29 22:34:55 24 4
gpt4 key购买 nike

我正在尝试实现以下方法:
void Ball::DrawOn(Gr​​aphics g);

该方法应绘制球的所有先前位置(存储在队列中),最后绘制当前位置。我不知道这是否重要,但我使用 g.DrawEllipse(...) 打印以前的位置,使用 g.FillEllipse(...) 打印当前位置>.

问题是,正如您想象的那样,有很多绘图需要完成,因此显示器开始频繁闪烁。我一直在寻找一种双缓冲的方法,但我能找到的只有这两种方法:

  1. System.Windows.Forms.Control.DoubleBuffered = true;

  2. SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);

在尝试使用第一个方法时,我收到一条错误消息,解释说在此方法中,属性 DoubleBuffered 由于其保护级别而无法访问。虽然我不知道如何使用 SetStyle 方法。

是否有可能在所有访问是我在方法中作为输入获得的图形对象时加倍缓冲?

提前致谢

编辑:我创建了以下类

namespace doubleBuffer
{
class BufferedBall : System.Windows.Forms.Form
{
private Ball ball;
public BufferedBall(Ball ball)
{
this.ball = ball;
}

public void DrawOn(Graphics g)
{
this.DoubleBuffered = true;
int num = 0;
Rectangle drawArea1 = new Rectangle(5, 35, 30, 100);
LinearGradientBrush linearBrush1 =
new LinearGradientBrush(drawArea1, Color.Green, Color.Orange, LinearGradientMode.Horizontal);
Rectangle drawArea2 = new Rectangle(5, 35, 30, 100);
LinearGradientBrush linearBrush2 =
new LinearGradientBrush(drawArea2, Color.Black, Color.Red, LinearGradientMode.Vertical);
foreach (Point point in ball.previousLocations)
{
Pen myPen1;
if (num % 3 == 0)
myPen1 = new Pen(Color.Yellow, 1F);
else if (num % 3 == 1)
myPen1 = new Pen(Color.Green, 2F);
else
myPen1 = new Pen(Color.Red, 3F);
num++;
myPen1.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
myPen1.StartCap = System.Drawing.Drawing2D.LineCap.RoundAnchor;
myPen1.EndCap = System.Drawing.Drawing2D.LineCap.AnchorMask;
g.DrawEllipse(myPen1, (float)(point.X - ball.radius), (float)(point.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}
if ((ball.Host.ElapsedTime * ball.Host.FPS * 10) % 2 == 0)
{
g.FillEllipse(linearBrush1, (float)(ball.Location.X - ball.radius), (float)(ball.Location.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}
else
{
g.FillEllipse(linearBrush2, (float)(ball.Location.X - ball.radius), (float)(ball.Location.Y + ball.radius), (float)(2 * ball.radius), (float)(2 * ball.radius));
}
}
}
}

球 drawOn 看起来像这样:

new BufferedBall(this).DrawOn(g);

你是这个意思吗?因为它还在闪烁?

最佳答案

Form 类具有公开为 protected DoubleBuffered 属性。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered.aspx但是由于您从 Form 派生表单,因此您可以使用它。

关于c# - 双缓冲 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3070208/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com