gpt4 book ai didi

c# - 使用 C# 双缓冲有负面影响

转载 作者:行者123 更新时间:2023-11-30 19:34:01 25 4
gpt4 key购买 nike

我写了下面这个简单的程序,它每 100 毫秒在屏幕上画一条线(由 timer1 触发)。我注意到绘图有点闪烁(也就是说,窗口并不总是完全是蓝色的,而是透出一些灰色)。所以我的想法是使用双缓冲。但当我这样做时,事情变得更糟了。现在屏幕几乎总是灰色的,只是偶尔会出现蓝色(由 timer2 演示,每 2000 毫秒切换一次 DoubleBuffered 属性)。

对此有何解释?

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}

private void Form1_Paint(object sender, PaintEventArgs e) {
Graphics g = CreateGraphics();
Pen pen = new Pen(Color.Blue, 1.0f);
Random rnd = new Random();
for (int i = 0; i < Height; i++)
g.DrawLine(pen, 0, i, Width, i);
}

// every 100 ms
private void timer1_Tick(object sender, EventArgs e) {
Invalidate();
}

// every 2000 ms
private void timer2_Tick(object sender, EventArgs e) {
DoubleBuffered = !DoubleBuffered;
this.Text = DoubleBuffered ? "yes" : "no";
}
}
}

最佳答案

我会把你所有的项目都画到你自己的缓冲区,然后一次把它全部复制进去。我已经在许多应用程序中将它用于图形,它对我来说一直很有效:

    public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
Invalidate();// every 100 ms
}
private void Form1_Load(object sender, EventArgs e)
{
DoubleBuffered = true;
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Bitmap buffer = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(buffer);
Pen pen = new Pen(Color.Blue, 1.0f);
//Random rnd = new Random();
for (int i = 0; i < Height; i++)
g.DrawLine(pen, 0, i, Width, i);
BackgroundImage = buffer;
}

编辑:经过进一步调查,您的问题似乎是您将 Graphics 对象设置为:

Graphics g = CreateGraphics();

需要:

Graphics g = e.Graphics();

所以你的问题可以通过像我上面那样创建一个手动缓冲区来解决,或者简单地改变你的 Graphics 对象。我对两者都进行了测试,它们都有效。

关于c# - 使用 C# 双缓冲有负面影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566126/

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