comment arrêter le scintillement C#, winforms

J'ai un programme qui est essentiellement comme une application de la peinture. Cependant, mon programme a un scintillement questions. J'ai la ligne suivante dans mon code (qui doit se débarrasser de scintillement - mais qui ne marche pas):

this.SetStyle(ControlStyles.AllPaintingInWmPaint 
| ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

mon code(sans les super et les sous-catégories pour les formes est comme suit:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Paint
{
public partial class Paint : Form
{
private Point startPoint;
private Point endPoint;
private Rectangle rect = new Rectangle();
private Int32 brushThickness = 0;
private Boolean drawSPaint = false;
private List<Shapes> listOfShapes = new List<Shapes>();
private Color currentColor;
private Color currentBoarderColor;
private Boolean IsShapeRectangle = false;
private Boolean IsShapeCircle = false;
private Boolean IsShapeLine = false;
public SPaint()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
currentColor = Color.Red;
currentBoarderColor = Color.DodgerBlue;
IsShapeRectangle = true; 
}
private void panelArea_Paint(object sender, PaintEventArgs e)
{
Graphics g = panelArea.CreateGraphics();
if (drawSPaint == true)
{
Pen p = new Pen(Color.Blue);
p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
if (IsShapeRectangle == true)
{
g.DrawRectangle(p, rect);
}
else if (IsShapeCircle == true)
{
g.DrawEllipse(p, rect);
}
else if (IsShapeLine == true)
{
g.DrawLine(p, startPoint, endPoint);
}
}
foreach (Shapes shape in listOfShapes)
{
shape.Draw(g);
}
}
private void panelArea_MouseDown(object sender, MouseEventArgs e)
{
startPoint.X = e.X;
startPoint.Y = e.Y;
drawSPaint = true;
}
private void panelArea_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
if (e.X > startPoint.X)
{
rect.X = startPoint.X;
rect.Width = e.X - startPoint.X;
}
else
{
rect.X = e.X;
rect.Width = startPoint.X - e.X;
}
if (e.Y > startPoint.Y)
{
rect.Y = startPoint.Y;
rect.Height = e.Y - startPoint.Y;
}
else
{
rect.Y = e.Y;
rect.Height = startPoint.Y - e.Y;
}
panelArea.Invalidate();
}
}
private void panelArea_MouseUp(object sender, MouseEventArgs e)
{
endPoint.X = e.X;
endPoint.Y = e.Y;
drawSPaint = false;
if (rect.Width > 0 && rect.Height > 0)
{
if (IsShapeRectangle == true)
{
listOfShapes.Add(new TheRectangles(rect, currentColor, currentBoarderColor, brushThickness));
}
else if (IsShapeCircle == true)
{
listOfShapes.Add(new TheCircles(rect, currentColor, currentBoarderColor, brushThickness));
}
else if (IsShapeLine == true)
{
listOfShapes.Add(new TheLines(startPoint, endPoint, currentColor, currentBoarderColor, brushThickness));
}
panelArea.Invalidate();
}
}
private void rectangleToolStripMenuItem_Click(object sender, EventArgs e)
{
IsShapeRectangle = true;
IsShapeCircle = false;
IsShapeLine = false; 
}
private void ellipseToolStripMenuItem_Click(object sender, EventArgs e)
{
IsShapeRectangle = false;
IsShapeCircle = true;
IsShapeLine = false; 
}
private void lineToolStripMenuItem_Click(object sender, EventArgs e)
{
IsShapeCircle = false;
IsShapeRectangle = false;
IsShapeLine = true; 
}
private void ThicknessLevel0_Click(object sender, EventArgs e)
{
brushThickness = 0; 
}
private void ThicknessLevel2_Click(object sender, EventArgs e)
{
brushThickness = 2; 
}
private void ThicknessLevel4_Click(object sender, EventArgs e)
{
brushThickness = 4; 
}
private void ThicknessLevel6_Click(object sender, EventArgs e)
{
brushThickness = 6; 
}
private void ThicknessLevel8_Click(object sender, EventArgs e)
{
brushThickness = 8; 
}
private void ThicknessLevel10_Click(object sender, EventArgs e)
{
brushThickness = 10; 
}
private void ThicknessLevel12_Click(object sender, EventArgs e)
{
brushThickness = 12; 
}
private void ThicknessLevel14_Click(object sender, EventArgs e)
{
brushThickness = 14; 
}
private void FillColour_Click(object sender, EventArgs e)
{
ColorDialog fillColourDialog = new ColorDialog();
fillColourDialog.ShowDialog();
currentColor = fillColourDialog.Color;
panelArea.Invalidate(); 
}
private void button1_Click(object sender, EventArgs e)
{
ColorDialog fillColourDialog = new ColorDialog();
fillColourDialog.ShowDialog();
currentBoarderColor = fillColourDialog.Color;
panelArea.Invalidate(); 
}
}
}

Comment puis-je arrêter le clignotement?

*Mise à JOUR:*Ce code fonctionne très bien quand je dessine directement sur le formulaire. Cependant, lorsque j'essaie de tirer sur le panneau, le clignotement devient un problème

  • Avez-vous également définir this.DoubleBuffered = true; ?
  • Marc Gravel, j'ai juste essayé d'ajouter dans cet.DoubleBuffered = vrai; et c'est encore vacillante comme un fou :S
  • Est panelArea plein de contrôles? Invalider fonctionne de manière récursive et, par conséquent, peut-coup de pied de chaque contrôle enfant dans panelArea à repeindre
  • Régime non, panelArea est juste un panneau que j'utilise pour dessiner. Il n'a pas de commandes mais..
  • Avez-vous mis la ClipSiblings style sur toutes vos commandes? Il est possible que le scintillement est causé par de multiples repeint sur les commandes (si ils se chevauchent).
  • Osterman Hmm, je viens de déménager tout donc rien ne se chevauchent dans le moindre. Il y a encore beaucoup de scintillement passe bien :S
  • +1, franchement le SetStyle fonction m'a aidé à effacer le scintillement. c# est soooo beaucoup plus mieux que le c++ !!!

InformationsquelleAutor BigBug | 2011-11-08