C#在移动具有多种形状的对象时闪烁

时间:2016-01-07 21:38:54

标签: c# winforms flicker

我正在制作一个程序,我希望移动一个由多个形状(矩形,圆形,点形)组成的角色,但是当角色移动时,它会闪烁。

我尝试了多种解决方案,例如更改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中,但它们会在所有动画中出现)

1 个答案:

答案 0 :(得分:0)

在表单中设置此代码。它会消除闪烁。通过设置实际上是WS_EX_TRANSPARENT标志的ExStyle,它使窗口控件对鼠标事件不可见,从而减少了大量的闪烁。

 protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000; //WS_EX_TRANSPARENT flag

                return cp;
            }
        }

希望有所帮助