我正在制作一个程序,我希望移动一个由多个形状(矩形,圆形,点形)组成的角色,但是当角色移动时,它会闪烁。
我尝试了多种解决方案,例如更改DoubleBuffered,SetStyle,但它们不起作用,我不知道如何做到这一点。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Carrosse
{
public partial class EcranAccueil : Form
{
private Capitaine cptHaddock;
private BufferedGraphics bufferG = null;
private Graphics g;
public EcranAccueil()
{
InitializeComponent();
// Modification contre le scintillement - Creation d'une mémoire tampon graphique
bufferG = BufferedGraphicsManager.Current.Allocate(TV.CreateGraphics(), TV.DisplayRectangle);
g = bufferG.Graphics;
}
private void btnCreercptHaddock_Click(object sender, EventArgs e)
{
this.cptHaddock = new Capitaine(this.TV, 50, 80, 60, 20);
this.cptHaddock.Pot = Color.Blue;
this.cptHaddock.Afficher(this.TV.Handle);
this.btnMarcherSimple.Enabled = true;
this.btnChangerRapidite.Enabled = true;
this.btnMarcherContinu.Enabled = true;
}
private void btnMarcherSimple_Click(object sender, EventArgs e)
{
this.cptHaddock.AvancerDroit(this.TV.Handle, this.timerImage, 16, 0);
this.cptHaddock.AvancerGauche(this.TV.Handle, this.timerImage, 16, 0);
}
private void btnChangerRapidite_Click(object sender, EventArgs e)
{
try
{
this.timerImage.Interval = Int32.Parse(tbRapidite.Text);
}
catch (Exception)
{
tbRapidite.Text = "Valeur non valide !";
}
}
private void btnMarcherContinu_Click(object sender, EventArgs e)
{
for (int i = 0; i < 4; i++)
{
this.cptHaddock.AvancerDroit(this.TV.Handle, this.timerImage, 16, 0);
this.cptHaddock.AvancerGauche(this.TV.Handle, this.timerImage, 16, 0);
}
}
}
}
按钮btnCreercptHaddock创建角色。 按钮btnMarcherSimple和btnMarcherContinu移动角色。 该按钮借助输入通过计时器改变角色的速度。
我可以提供我的程序的其他部分,但我有10个类。
PS:我是学生,而且我正在学习C#,所以我的代码可能没有优化,所以如果你有意见或建议,我很乐意听到。编辑:动画的GIF:https://i.gyazo.com/68ded3fba8fddbf281a424bbb523f2d2.gif(所有的闪烁都不会出现在gif中,但它们会在所有动画中出现)
答案 0 :(得分:0)
在表单中设置此代码。它会消除闪烁。通过设置实际上是WS_EX_TRANSPARENT标志的ExStyle,它使窗口控件对鼠标事件不可见,从而减少了大量的闪烁。
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; //WS_EX_TRANSPARENT flag
return cp;
}
}
希望有所帮助