J'ai trouvé ce code en ligne, et je veux l'utiliser pour dessiner une petite boîte bleue, en plus de mon dessin. Mais quand je clique sur l'image, la boîte bleue apparaît, mais elle redessine toute la zone d'image, c'est un problème parce que j'ai une image très complexe, et il faut quelques secondes pour la redessiner. Y a-t-il un moyen de contourner l'Invalidate? Peut-être une boîte à image à l'intérieur d'une boîte à images, avec le backpicturebox mon dessin complexe, et le frontpicturebox la boîte bleue avec un rafraîchissement? Je ne peux pas sembler obtenir la couleur d'arrière-plan avant picturebox transparente, quelqu'un pourrait-il m'aider?Actualisation de la boîte d'images C# sans redessiner le dessin courant
private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
// Determine the initial rectangle coordinates...
if (MeasureMentimported && !selectieBezig)
{
RectStartPoint = e.Location;
//Invalidate();
selectieBezig = true;
}
}
// Draw Rectangle
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
//Als er niet links wordt geklikt, dan gewoon weer terug.
if (e.Button != MouseButtons.Left)
return;
//Alleen als de measurementfile is geladen, gaan we kijken of er iets te selecteren valt.
if (MeasureMentimported && selectieBezig)
{
Point tempEndPoint = e.Location;
int X1 = Math.Min(RectStartPoint.X, tempEndPoint.X);
int Y1 = Math.Min(RectStartPoint.Y, tempEndPoint.Y);
int X2 = Math.Max(RectStartPoint.X, tempEndPoint.X);
int Y2 = Math.Max(RectStartPoint.Y, tempEndPoint.Y);
Rect.Location = new Point(X1, Y1);
Rect.Size = new Size(X2 - X1, Y2 - Y1);
picTekenvlak.Invalidate();
//Rect.Location = new Point(
// Math.Min(RectStartPoint.X, tempEndPoint.X),
// Math.Min(0, 1000));
//Rect.Size = new Size(
// Math.Abs(RectStartPoint.X - tempEndPoint.X),
// Math.Abs(1000));
// MessageBox.Show("k");
}
}
// Draw Area
//
private void pictureBox1_Paint1(object sender, System.Windows.Forms.PaintEventArgs e)
{
if (MeasureMentimported)
{
if (Rect != null && Rect.Width > 0 && Rect.Height > 0)
{
e.Graphics.FillRectangle(selectionBrush, Rect);
}
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
selectieBezig = false;
if (e.Button == MouseButtons.Right)
{
if (Rect.Contains(e.Location))
{
Console.WriteLine("Right click");
}
}
}
Voici quelques conseils qui pourraient vous être utiles: 1. vous pourriez essayer de mettre en cache votre image complexe dans un tampon, de sorte qu'il ne faut pas beaucoup de temps pour la redessiner; 2. autant que je me souvienne, vous devez placer le pinceau d'arrière-plan de Windows (l'hôte de l'image) à transparent, de sorte que vous éviterez de scintiller lors du re-dessin (et peut-être devrez-vous redéfinir le comportement de dessin de cette Fenêtre); 3. Peut-être qu'au lieu de dessiner sur le dessus, vous pouvez créer une autre fenêtre de forme rectangulaire et la placer sur le dessus de votre conteneur d'image. –
Pour qu'un contrôle dans les winforms soit transparent il doit être imbriqué dans celui ci-dessous. Pour une picturebox, vous devez faire ceci dans le code__: 'pbox1.parent = pbox0;' - Vous pouvez essayer d'invalider seulement le lien externe de l'ancien et le nouveau rectangle: 'invalidate (Rectangle.Union (oldRect, newRect))' Aussi: qu'est-ce qu'une image 'complexe' ?? Grand? Large comment? Et: qu'est-ce que 'picTekenvlak'? – TaW