2009-06-17 7 views
0

J'ai deux contrôles qui sont tous deux contenus dans un contrôle utilisateur.Récupère la zone d'un PictureBox qui est couvert par un panneau

  • emplacement du panneau: 49, 400
  • taille Panel: 787, 70
  • Picturebox Lieu: 25, 0
  • Picturebox Taille: 737, 700

Picturebox est vu sous le panneau.

Je pourrais utiliser quelques conseils sur la meilleure façon de déterminer la zone de l'image PictureBox couverte par le panneau, afin que je puisse copier l'image sur le panneau correctement dans l'appel DrawImage.

Ma réponse est: Je vais copier l'écran de cette zone: 24 400 en haut à gauche, ce sera 714 large, 70 élevé Mais comment automatiser pour travailler avec n'importe quelle combinaison de panneau et boîte d'image pour un contrôle réutilisable ? Si vous avez besoin de plus d'informations: PictureBox contient une image d'une carte. Le panneau contient des outils pour manipuler la carte, le panneau est positionné sur PictureBox. Le panneau doit être semi-transparent pour que l'image de la carte soit toujours visible. En raison de la manière dont winforms peint la transparence, (en appelant l'arbre de contrôle pour que le parent se peigne lui-même) - quand je peins mon panneau, il prend la couleur de l'arrière-plan de l'usercontrol, pas l'image de la carte ci-dessous. Mes pensées pour ceci sont: si je peux copier l'image de la carte qui est en dessous du panneau à l'arrière-plan du panneau, puis peindre mon fond semi-transparent, je serai capable de simuler l'effet que les concepteurs ont demandé .

Le code d'origine du panneau est l'endroit où je prends l'image de la boîte d'image. Je copie cette image en arrière-plan dans l'événement OnPaint.

If bmpScreenshot Is Nothing Then 
      PushScreen() 
     End If 
     If Not bmpScreenshot Is Nothing Then 
      pevent.Graphics.DrawImage(bmpScreenshot, GetPaintOffset()) 
     End If 

Enfin, après avoir ajouté le changement de la réponse acceptée, voici le code modifié où l'image est saisie.

Dim sizeOfImage As Size = New Size(ClientRectangle.Width _ 
            , ClientRectangle.Height) 
      bmpScreenshot = New Bitmap(sizeOfImage.Width, sizeOfImage.Height, PixelFormat.Format32bppArgb) 

      gfxScreenshot = Graphics.FromImage(bmpScreenshot) 

      Dim rect As Rectangle = Rectangle.Intersect(mPictureBox1.Bounds, Bounds) 
      Dim destrect As Rectangle = New Rectangle(rect.Left - Left, _ 
      rect.Top - Top, rect.Width, rect.Height) 
      Dim imgrect As Rectangle = _ 
       New Rectangle(rect.Left - mPictureBox1.Bounds.Left, _ 
       rect.Top - mPictureBox1.Bounds.Top, rect.Width, rect.Height) 

      gfxScreenshot.DrawImage(mPictureBox1.Image, destrect, _ 
       imgrect, GraphicsUnit.Pixel) 

Répondre

3

Vous pouvez utiliser la méthode Rectangle.Intersect (avec un petit peu de calcul) pour obtenir le résultat souhaité. C# échantillon:

Rectangle rect = Rectangle.Intersect(_pictureBox.Bounds, _panel.Bounds); 
rect = new Rectangle(rect.Top - _panel.Top, rect.Left - _panel.Left, rect.Width, rect.Height); 
e.Graphics.FillRectangle(Brushes.Red, rect); 

Mise à jour

J'ai joué avec cela un peu plus et est venu avec la solution suivante, que je trouve un peu plus simple et aussi un peu plus robuste (cette fois VB. Code NET):

Private Sub DrawPanelBackground(ByVal pictureBox As PictureBox, ByVal panel As Panel) 
    If pictureBox.Image Is Nothing Then 
     Exit Sub 
    End If 

    Dim rect As Rectangle = New Rectangle(pictureBox.Left - panel.Left, pictureBox.Top - panel.Top, pictureBox.Image.Width, pictureBox.Image.Height) 
    Using g As Graphics = Panel.CreateGraphics() 
     g.DrawImage(pictureBox.Image, rect) 
    End Using 
End Sub 
+0

La méthode Control.Bounds donnera exactement ce qui est nécessaire si le Panel et PictureBox partagent un parent (probablement le contrôle utilisateur). –

+0

Merci, je vais essayer ces différents emplacements de contrôle et vous le faire savoir! – bperreault

+0

l'édition montre le code que je 'pense' supposerait panneau est toujours à l'intérieur de l'imagebox. Que faire si le panneau supérieur gauche était en dehors du rectangle de l'image? – bperreault

Questions connexes