2009-06-17 1 views
0

У меня есть два элемента управления, которые содержатся в пользовательском элементе управления.Получите область PictureBox, которая покрыта панелью

  • Расположение панели: 49, 400
  • панель Размер: 787, 70
  • PictureBox местоположение: 25, 0
  • PictureBox Размер: 737, 700

PictureBox является видно внизу панель.

Я мог бы использовать некоторые советы по наилучшему определению области изображения PictureBox, покрываемой панелью, поэтому я могу правильно скопировать изображение на панель в вызове DrawImage.

Ответ: Я скопирую экран из этой области: 24,400 в верхнем левом углу, он будет 714 широко, 70 высоко Но как я могу автоматизировать работу с любой комбинацией панели и окна изображения для повторно используемого элемента управления ?

Если вам нужна дополнительная информация: PictureBox содержит изображение карты. Панель содержит инструменты для манипулирования картой, панель расположена поверх PictureBox. Панель должна быть полупрозрачной, чтобы изображение карты все еще просматривалось через нее.

Из-за того, что winforms создает прозрачность, (вызывая через дерево управления, чтобы родительская краска сама себя) - когда я рисую свою панель, она принимает цвет фона пользовательского контроля, а не изображение карту ниже нее.

Мои мысли для этого: если я могу скопировать изображение карты под панелью на фон панели, а затем нарисовать полупрозрачный фон, я смогу имитировать эффект, который запросили дизайнеры ,

Оригинальный код с панели, где я беру изображение из окна изображения.

  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) 

Я скопирую это изображение на задний план в событии OnPaint.

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

И, наконец, после добавления изменения от принятого ответа, вот измененный код где хватают изображение.

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) 

ответ

3

Вы можете использовать метод Rectangle.Intersect (вместе с чуть-чуть расчета), чтобы получить результат, который вы хотите. C# пример:

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

Update

Я играл с этим немного больше и придумал следующее решением, что я нахожу немного проще, а также немного более надежным (на этот раз VB. 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

Метод Control.Bounds даст именно то, что необходимо, если Panel и PictureBox совместно используют родительский элемент (предположительно, пользовательский элемент управления). –

+0

Спасибо, я дам им попробовать в другом месте управления и дам вам знать! – bperreault

+0

Редактирование показывает код, который, я думаю, будет считать панель всегда внутри рамки. Что, если верхняя часть панели слева была вне прямоугольника прямоугольника? – bperreault

Смежные вопросы