2009-06-17 9 views
0

Ich habe zwei Steuerelemente, die beide in einem Benutzersteuerelement enthalten sind.Holen Sie sich den Bereich einer PictureBox, die von einem Panel abgedeckt wird

  • Panel-Standort: 49, 400
  • Panelgröße: 787, 70
  • Picturebox Ort: 25, 0
  • Picturebox Größe: 737, 700

Picturebox ist unter dem Panel gesehen.

Ich könnte einen Ratschlag für den besten Weg verwenden, um den Bereich des PictureBox-Bildes zu bestimmen, das vom Panel abgedeckt wird, damit ich das Bild in DrawImage korrekt auf das Panel kopieren kann.

Meine Antwort ist: Ich werde Bildschirm aus diesem Bereich kopieren: 24.400 oben links, es wird 714 breit sein, 70 hoch Aber wie automatisiere ich mit jeder Kombination von Panel und Picture Box für eine wiederverwendbare Steuerung zu arbeiten ?

Hintergrund, wenn Sie weitere Informationen benötigen: Die PictureBox enthält ein Bild einer Karte. Das Bedienfeld enthält Werkzeuge zum Bearbeiten der Karte. Das Bedienfeld befindet sich oben auf PictureBox. Das Panel muss halbtransparent sein, damit das Kartenbild immer noch sichtbar ist.

Aufgrund der Art und Weise, wie winforms Transparenz zeichnet (beim Aufruf über den Kontrollbaum, damit sich der Parent selbst malt), nimmt er beim Malen meines Panels die Farbe des Hintergrunds der Benutzersteuerung an, nicht das Bild von die Karte darunter.

Meine Gedanken dazu sind: Wenn ich das Bild der Karte unter dem Panel in den Hintergrund des Panels kopieren und dann meinen halbtransparenten Hintergrund malen kann, kann ich den Effekt simulieren, den Designer angefordert haben .

Original-Code aus dem Panel ist, wo ich das Bild aus der Bilderbox greifen.

  Dim x As Integer = GetXOffset() 
      Dim y As Integer = GetYOffset() 

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

      gfxScreenshot = Graphics.FromImage(bmpScreenshot) 
      Dim destrect As New Rectangle(ClientRectangle.X, ClientRectangle.Y, _ 
         ClientRectangle.Width, ClientRectangle.Height) 


      gfxScreenshot.DrawImage(mPictureBox1.Image, destrect, New Rectangle(x, y, _ 
       sizeOfImage.Width, sizeOfImage.Height), GraphicsUnit.Pixel) 

Ich kopiere dieses Bild in den Hintergrund im OnPaint-Ereignis.

Und schließlich, nach dem Hinzufügen der Änderung von der angenommenen Antwort, hier ist der modifizierte Code, wo das Bild erfasst wird.

Antwort

3

Sie können die Rectangle.Intersect-Methode (zusammen mit ein wenig Berechnung) verwenden, um das gewünschte Ergebnis zu erhalten. C# Beispiel:

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); 

aktualisiert

Ich spielte damit ein bisschen mehr und kam mit der folgenden Lösung auf, dass ich ein bisschen einfacher und auch ein bisschen robusten finden (diesmal VB. NET-Code):

+0

Die Control.Bounds-Methode wird genau geben, was benötigt wird, wenn das Panel und PictureBox ein Elternteil (vermutlich das Benutzersteuerelement) teilen. –

+0

Danke, ich gebe diese an verschiedenen Kontrollstellen aus und lass es dich wissen! – bperreault

+0

die Bearbeitung zeigt Code, den ich "denke" würde annehmen Panel ist immer in Bildbox. Was, wenn die obere linke Ecke außerhalb des Rechtecks ​​der Bildbox liegt? – bperreault

Verwandte Themen