使用 gdi+ 进行无闪烁绘图
Flickerfree drawing using gdi+
我有一个要绘制的 .png 文件,但问题是,我每 1/10 秒绘制一次此 png,所以每秒绘制 10 次。此 png 是以 X 和 Y 坐标作为中点绘制的,因此图像的中间是 X 和 Y 坐标。
使用此代码:
private void frmMap_Paint(object sender, PaintEventArgs e)
{
Bitmap FlashLight = new Bitmap(
Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"light.png"), 4000, 2160);
e.Graphics.DrawImage(FlashLight, new Point(mapX, mapY));
}
问题是,当每秒绘制此 png 10 次时,改变 X 和 Y 坐标会导致大量闪烁。
有没有人知道如何减少或消除闪烁?我研究过在屏幕外绘制位图并在绘制完成后加载它,但我不知道该怎么做。
我也研究过双缓冲,我也不知道如何使用它来减少闪烁。
Winforms
绝对不适合做动画
这是一个建议,您可能会觉得不够好:
将大 Image
加载到 PictureBox.Image
并设置 PictureBox.SizeMode = AutoSize
。
然后在动画中 Timer.Tick
移动 PictureBox
。
这是一个小例子:
Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += timer_Tick;
// when the timer runs..
timer.Enabled = !timer.Enabled;
..它移动 PictureBox
左右:
void timer_Tick(object sender, EventArgs e)
{
Point pt = new Point(pictureBox1.Left + offsetX, pictureBox1.Top + offsetY);
pictureBox1.Location = pt;
}
请注意,该位置可以毫无问题地进入负数!
要使图像的初始位置居中,请使用:
pictureBox1.Location = new Point(-(pictureBox1.Width - Width)/2,
-(pictureBox1.Height - Height)/2);
要获得更好的动画支持,您可以考虑使用 WPF。
我有一个要绘制的 .png 文件,但问题是,我每 1/10 秒绘制一次此 png,所以每秒绘制 10 次。此 png 是以 X 和 Y 坐标作为中点绘制的,因此图像的中间是 X 和 Y 坐标。
使用此代码:
private void frmMap_Paint(object sender, PaintEventArgs e)
{
Bitmap FlashLight = new Bitmap(
Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @"light.png"), 4000, 2160);
e.Graphics.DrawImage(FlashLight, new Point(mapX, mapY));
}
问题是,当每秒绘制此 png 10 次时,改变 X 和 Y 坐标会导致大量闪烁。
有没有人知道如何减少或消除闪烁?我研究过在屏幕外绘制位图并在绘制完成后加载它,但我不知道该怎么做。
我也研究过双缓冲,我也不知道如何使用它来减少闪烁。
Winforms
绝对不适合做动画
这是一个建议,您可能会觉得不够好:
将大 Image
加载到 PictureBox.Image
并设置 PictureBox.SizeMode = AutoSize
。
然后在动画中 Timer.Tick
移动 PictureBox
。
这是一个小例子:
Timer timer = new Timer();
timer.Interval = 100;
timer.Tick += timer_Tick;
// when the timer runs..
timer.Enabled = !timer.Enabled;
..它移动 PictureBox
左右:
void timer_Tick(object sender, EventArgs e)
{
Point pt = new Point(pictureBox1.Left + offsetX, pictureBox1.Top + offsetY);
pictureBox1.Location = pt;
}
请注意,该位置可以毫无问题地进入负数!
要使图像的初始位置居中,请使用:
pictureBox1.Location = new Point(-(pictureBox1.Width - Width)/2,
-(pictureBox1.Height - Height)/2);
要获得更好的动画支持,您可以考虑使用 WPF。