2016-01-07 2 views
1

Я работаю над программой, в которой я хочу переместить персонаж, состоящий из нескольких фигур (прямоугольник, круг, точка), но когда символ перемещается, он мерцает.C# Мерцание при перемещении объекта с несколькими формами

Я пробовал несколько решений, таких как изменение 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#, поэтому мой код, возможно, не оптимизирован, поэтому, если у вас есть комментарии или советы, я был бы рад их услышать.

EDIT: GIF анимации: https://i.gyazo.com/68ded3fba8fddbf281a424bbb523f2d2.gif (Все мерцает не отображаются в формате GIF, но они появляются в течение всего анимации)

+0

Согласно [этому сообщению] (http://blogs.msdn.com/b/jeremykuhne/archive/2005/09/08/462344.aspx) с помощью 'BufferedGraphicsManager 'на самом деле не очень хорошая идея, если вы можете включить doublebuffered самостоятельно или использовать элемент управления, который по умолчанию является двойным буфером. 'PictureBox' __is__ и использовать его, вероятно, в любом случае. – TaW

+0

Я использую PictureBox. Телевизор - это изображение. Об управлении, я никогда не использую это раньше, и я действительно не понимаю его цели. – DoctorHouse

+0

Итак, двойной буферизатор, который встроен и один из BufferedGraphicsManager, оба являются dong одинаковыми ..? Я считаю, что нужно использовать только один; если это так, переписывание без BufferedGraphicsManager, используя только событие Paint, и его объект e.Graphics может помочь, но я никогда не использовал BufferedGraphicsManager сам. – TaW

ответ

0

Установите этот код в форму. Он удалит мерцание. Установив ExStyle, который фактически является флагом WS_EX_TRANSPARENT, он делает управление окнами невидимым для событий мыши, что, в свою очередь, уменьшает значительное количество мерцания.

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

       return cp; 
      } 
     } 

Надеется, что это помогает

+1

Как насчет улучшения ответа, объясняя это, почему это работает или что именно оно делает. –

+0

Я также пробовал эту идею, и мой персонаж не появляется с этим. Это без изменений: https://i.gyazo.com/68ded3fba8fddbf281a424bbb523f2d2.gif (Все мерцания не отображаются в gif, но появляются во время всей анимации) Это ваше решение: https: // gyazo.com/6607b6dce329c166e2fbaeba85d8b9fe – DoctorHouse