C # graphiques scintillants
Je suis en train de travailler sur le type de programme de dessin, mais j'ai un problème avec le scintillement en déplaçant un curseur de la souris pendant le tracé d'un trait des ligne. J'espère que vous pourrez m'aider pour supprimer le scintillement de la ligne, voici le code:
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 GraphicsTest
{
public partial class Form1 : Form
{
int xFirst, yFirst;
Bitmap bm = new Bitmap(1000, 1000);
Graphics bmG;
Graphics xG;
Pen pen = new Pen(Color.Black, 1);
bool draw = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
bmG = Graphics.FromImage(bm);
xG = this.CreateGraphics();
bmG.Clear(Color.White);
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
xFirst = e.X;
yFirst = e.Y;
draw = true;
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
bmG.DrawLine(pen, xFirst, yFirst, e.X, e.Y);
draw = false;
xG.DrawImage(bm, 0, 0);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (draw)
{
xG.DrawImage(bm, 0, 0);
xG.DrawLine(pen, xFirst, yFirst, e.X, e.Y);
}
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
xG.DrawImage(bm, 0, 0);
}
}
}
source d'informationauteur Jeff
Vous devez vous connecter pour publier un commentaire.
Avant tout n'utilisez pas
CreateGraphics()
sauf si vous devez absolument. Lier un gestionnaire d'événements pourOnPaint
et appelInvalidate()
lorsque vous voulez vous rafraîchir la surface.Si vous ne voulez pas de scintillement, vous aurez besoin de la double mémoire tampon de votre surface de dessin. La meilleure façon de le faire est de mettre votre formulaire
DoubleBuffered
True à la propriété.Je le recommande fortement si vous prévoyez sur l'extension de cela pour faire votre dessin pour le contrôle PictureBox. PictureBox est à double tampon par défaut et vous permet de contrôler votre dessin région beaucoup plus simplement.
Dans le code:
Edit:
Une autre question, vous êtes la création d'un privé
Pen
membre. Stylos (et Pinceaux, ainsi que de nombreux GDI+ objets) représentent des poignées pour les objets managés qui doivent être éliminés, sinon votre programme de fuite. Soit les envelopper dansusing
états (l'privilégié et d'exception-safe) ou explicitement les jeter dans la forme duDispose
méthode.Alternativement dans le Système.Dessin, vous pouvez accéder à certains pré-construite de crayons et de Pinceaux qui n'ont pas besoin d'être (et ne devrait pas être) sont éliminés. Utiliser comme:
La raison pour laquelle il est vacillante, c'est que vous êtes le dessin de l'arrière-plan (ce qui est immédiatement affiché sur l'écran, en essuyant la ligne), puis de superposer la ligne. Ainsi, la ligne conserve en train de disparaître et d'apparaître, donnant un scintillement de l'écran.
La meilleure solution pour cela est appelé le Double Buffering. Ce que vous faire est de tirer l'ensemble de l'image à la une "offscreen" bitmap, et seulement de l'afficher sur l'écran quand il est terminé. Parce que vous n'affiche que l'image terminée, il n'y a pas d'effet scintillant. Vous devez juste être en mesure de définir ce.DoubleBuffered = true pour obtenir WinForms à faire tout le travail dur pour vous.
NB: Vous ne devriez pas vraiment du dessin à l'extérieur de votre peinture gestionnaire - idéalement, vous devriez Invalidate() la zone qui a besoin de redessiner, et ensuite votre peinture gestionnaire de redessiner juste que la zone (avec tout recouvert lignes, etc.).
Fixe et code de travail.