2016-03-19 1 views
0

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"); 
     } 
    } 
} 
+0

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. –

+1

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

Répondre

0

L'événement OnPaint envoie un objet PaintEventArgs, qui décrit la quantité de repeindre basée sur PaintEventArgs.ClipRectangle. Vous pouvez contrôler cela en envoyant les coordonnées du rectangle bleu de l'appel à Invalidate.

Vous devrez ensuite utiliser ces coordonnées pour déterminer combien vous repeignez. Cela réduira également le montant de votre application pour tout type de superposition, comme faire glisser une autre application sur le PictureBox, etc.

Vous pouvez essayer de dessiner votre image complexe sur un Bitmap, puis affecter cette bitmap au PictureBox.Image . Je ne sais pas si cela va fonctionner, puisque vous dessinez directement sur la surface de l'image PictureBox, mais si vous pouvez le faire fonctionner, Windows va gérer l'écrêtage pour rendre l'image pour vous, ce qui est idéal.