2016-03-21 25 views
1

ile form2'nin Ekran Görüntüsü Burada bir sorunum var. Ayarları almak için kullandığım bir form1 var. Ancak, formun içinde ne olduğunu görmek için kullanmak istediğim bir panel var.vb.net Form1

Form2 formborderstyles

Bu form2 büyük ekranda bilgi gösterir ve ben (bu panelde) benim form1 bir screencapture şey gibi form2 tüm içeriğini görmek gerek olmadan tam ekran formu =.

Birisi yardımcı olabilir mi? WindowsForms içinde titreyen sorunları üretecek

cevap

1

A Paneli, ben sadece PictureBox yerine Paneli kullanmak sadece PictureBox.Dock = Fill mülkiyet seti ile Panel içinde PictureBox yerleştirmek önermek (veya) TakeScreenshotFromForm() işlevini ElektroKit Çerçeve sayfasından kullanabilirsiniz.

enter image description here

Tam çalışma örneği: Bunun yerine kullandığım metodolojinin

Imports System.Drawing.Drawing2D 
Imports System.Drawing.Imaging 

Public Class Form1 : Inherits Form 

    Friend WithEvents ScreenshotTimer As New System.Windows.Forms.Timer 

    Private Sub Test() Handles MyBase.Shown 

     Form2.Show() 

     With Me.ScreenshotTimer 
      .Interval = 100 
      .Enabled = True 
      .Start() 
     End With 

     Me.PictureBox1.BackgroundImageLayout = ImageLayout.Stretch 

    End Sub 

    Private Sub ScreenshotTimer_Tick(sender As Object, e As EventArgs) Handles ScreenshotTimer.Tick 

     If Me.PictureBox1.BackgroundImage IsNot Nothing Then 
      Me.PictureBox1.BackgroundImage.Dispose() 
     End If 

     Me.PictureBox1.BackgroundImage = TakeScreenshotFromForm(Form2, includeMouse:=True) 

    End Sub 

    Public Shared Function TakeScreenshotFromForm(ByVal f As Form, 
                Optional ByVal includeMouse As Boolean = False, 
                Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image 

     If Not f.Visible Then 
      Return Nothing 
     End If 

     Dim bmp As New Bitmap(f.Size.Width, f.Size.Height, pixelFormat) 

     Using g As Graphics = Graphics.FromImage(bmp) 

      g.InterpolationMode = InterpolationMode.Default 
      g.PixelOffsetMode = PixelOffsetMode.Default 
      g.CopyFromScreen(f.Location, New Drawing.Point(0, 0), f.Size) 

      ' Draw the cursor in the image. 
      If includeMouse Then 

       Dim cursorSize As System.Drawing.Size = CType(f.Cursor.HotSpot, System.Drawing.Size) 
       cursorSize.Width -= ((f.Size.Width - f.ClientSize.Width) \ 2) 
       cursorSize.Height -= ((f.Size.Height - f.ClientSize.Height) - ((f.Size.Width - f.ClientSize.Width) \ 2)) 

       Dim formPoint As Drawing.Point = f.PointToClient(Drawing.Point.Subtract(Control.MousePosition, cursorSize)) 

       Cursors.Arrow.Draw(g, New Rectangle(formPoint.X, formPoint.Y, cursorSize.Width, cursorSize.Height)) 

      End If 

     End Using 

     Return bmp 

    End Function 

End Class 

enter image description here, ayrıca olduğunda properlly Formu yakalamak için Control.DrawToBitmap() yöntemi kullanabilirsiniz görünmüyor (ekranda tamamen görünmez veya başka pencerelerle kaplanmış), ancak sonuçta ortaya çıkan görüntünün, Örneğin TextBox caret.

Dim bmp As New Bitmap(f.Bounds.Size.Width, f.Bounds.Size.Height, pixelFormat) 
f.DrawToBitmap(bmp, New Rectangle(0, 0, f.Bounds.Size.Width, f.Bounds.Size.Height)) 
' ... 
+0

bu bir süre sonra belleğime aşırı yüklenmeyecek mi? ve bu normal ekran görüntüsü ile aynı mı yoksa başka bir şey mi? @elektroStudios –

+0

@Thomas Dutoit Hayır, tek kullanımlık nesneler her zaman elden çıkarılır, ancak her aramadan sonra işlemin daha fazla bellek alanı ayırdığına dikkatinizi çekebilirsiniz. Çünkü .Net hafızayı yönetir (herhangi bir zamanda bir çöp koleksiyonunu zorlayabilirsin) Daha doğru bir hafıza tüketim değeri görmeye çalışmak için zaman, çünkü zorlamak için çok tavsiye edilmez). Bir "normal ekran görüntüsü" için ne demek istiyorsunuz ?, gösterdiğim yöntem, belirtilen formun bir görüntüsünü (ekran görüntüsü) alıyor, sizin sorduğunuz şey değil mi ?, Umarım bu yardım !. – ElektroStudios

+0

Cevabımın alt kısmında açıklanan alternatif yöntem, ekran görüntüsünden doğrudan kopyalamamış olmasından dolayı, ekran görüntüsünden daha "işlenmemiş bir görüntü" olabilir, çünkü bu alternatifi kullanıyorum dediğiniz gibi, odak dikdörtgen veya Bir karet, ancak diğer tarafta, ekranda görünmediğinde bir Form yakalamanız yararlı olur. – ElektroStudios