2015-05-24 1 views
1

Редактировать: Я был несколько успешным и считаю, что это может не сработать. В настоящее время это мерцает плохо, при этом Panel1 является Refreshhed() в моем цикле, но это не проблема и может быть исправлено в более позднем методе визуализации. Отказ от пользовательского элемента управления, и в обход непрозрачности материала, я использую следующие в основной панели случае краски, которая находится на главной форме:Создать образ из родительской графической графики (не фонового изображения)

Dim tempImage = New Bitmap(Picturebox1.Width, Picturebox1.Height) 
Dim memoryGraphics As Graphics = Graphics.FromImage(tempImage) 
Dim screenPos As Point = Picturebox1.PointToScreen(New Point(0, 0)) 
memoryGraphics.CopyFromScreen(screenPos.X, screenPos.Y, 0, 0, Picturebox1.Size) 

Dim destRect As New Rectangle(0, 0, Panel1.Width, Panel1.Height) 
Dim srcRect As New Rectangle(picscreen.Location.X, picscreen.Location.Y, Panel1.Width, Panel1.Height) 
e.Graphics.DrawImage(tempImage, destRect, srcRect, GraphicsUnit.Pixel) 

На моей форме: Picturebox1.Location (208, 0) & Панель 1. Расположение (208, 0). Оба родителя элемента управления должны быть основной формой, и я не могу назначить родительский элемент Panel1 Picturebox1.

Идея состоит в том, чтобы полупрозрачный дисплей панели над картой (графика Picturebox1). С приведенным выше кодом я показываю смещение того, что нарисовано на Panel1, от того, что нарисовано на Picturebox1, примерно на 208 пикселей (или налево на обоих элементах управления).

Я могу немного изменить некоторые точки в коде, чтобы уменьшить смещение, но это начнет показывать серый фон Panel1, который находится на Picturebox1: [т.е. Dim srcRect As New Rectangle (picscreen.Location.X - 100 ...] даст мне 100 пикселей серого с панели 1, и показать 100 пикселей ближе к выстроены ... идти более делает полный серый Panel1 цвет фона появляются вместо:

Temp

Потому что это получает изображение из всего, что есть на Picturebox1, оно также получает Panel1, а не то, что находится под ним. Я не верю, что то, что я пытаюсь сделать, будет возможно

+0

Трудно угадать, что «непрозрачности эффект» может означать. Просто не используйте Panel, используйте событие Paintbox, чтобы добиться такого же эффекта. Задайте свойство Graphics.CompositingMode и рисуйте, скажем, Graphics.FillRectangle(). –

+0

Поскольку графика нарисована на кадре, у него нет изображения или фонового изображения, а только графика, нарисованная на нем. Панель содержит дополнительные элементы управления. Я не уверен, что смогу нарисовать поддельную панель с непрозрачностью, а затем поместить все элементы управления. – Recoil

+0

Какова роль фотошопа во всем этом? как материал, постоянно наносимый на ПБ? – Plutonix

ответ

0

Вы можете получить контекст устройства обоих picbox и панели и BitBlt ту часть picbox вы хотите панели:

<DllImport("GDI32", SetLastError:=True)> Private Shared Function BitBlt(_ 
    ByVal hdcDest As IntPtr, _ 
    ByVal nXDest As Integer, _ 
    ByVal nYDest As Integer, _ 
    ByVal nWidth As Integer, _ 
    ByVal nHeight As Integer, _ 
    ByVal hdcSrc As IntPtr, _ 
    ByVal nXSrc As Integer, _ 
    ByVal nYSrc As Integer, _ 
    ByVal dwRop As Integer) As Boolean 
End Function 

Const SRCCOPY As Integer = &HCC0020 

Dim picboxGraphics As Graphics = PictureBox1.CreateGraphics 
Dim pnlGraphics As Graphics = Panel1.CreateGraphics 
Dim PictureBox_HDC As IntPtr = picboxGraphics.GetHdc 
Dim Panel_HDC As IntPtr = pnlGraphics.GetHdc 
BitBlt(Panel_HDC, 0, 0, 200, 200, PictureBox_HDC, 0, 0, SRCCOPY) '0, 200 are arbitrary 

picboxGraphics.ReleaseHdc(PictureBox_HDC) 
pnlGraphics.ReleaseHdc(Panel_HDC) 
picboxGraphics.Dispose() 
pnlGraphics.Dispose() 
+0

Это будет работать, когда я устанавливаю родительские панели в основную форму, и отобразит все элементы управления под ним. Это не работает, когда я устанавливаю родительский элемент в окно, где содержимое постоянно нарисовано, оно отображает только исходную обратную цветную (черную) картинку. – Recoil

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