Anwendung von Copy und Paste zur Fixierung einer Grafik
Die im einfachen Malprogramm angewendeten Grafikbefehle funktionieren zwar, aber die gezeichneten Objekte werden nur im Bildschirmspeicher Ihres PC, nicht aber im Grafikspeicher von Visual Basic aufbewahrt. Die Konsequenz daraus ist deutlich zu sehen, wenn man das Fenster mit einem gezeichneten Objekt bzw. Bild über den Rand des Bildschirms - und dann wieder zurück schiebt, oder wenn man ein anderes Fenster über die Zeichnung schiebt: Das gezeichnete Bild ist verschwunden.
Das Bild muss daher, um dies zu verhindern und um es speichern können, in einen anderen Speicherbereich kopiert werden: Der Speicherbereich, auf den auch die Funktionen zum Speichern von Grafik zugreifen.
Um dies zu realisieren, bauen wir eine Copy- und eine Paste-Funktion in das Programm ein.
Diese Funktionen werden im Beispielprogramm vor dem Speichern automatisch aufgerufen. Es ist auch möglich, sie über einen zusätzlichen Button zu aktivieren und damit, wie beim Copy-and-Paste Verfahren in anderen Anwendungsprogrammen, Bildelemente zu kopieren.
.
Machen wir dazu folgendes Experiment: Wir zeichnen ein beliebiges Muster auf die PictureBox. Danach schieben wir das Programmfenster (Form) über den Bildschirmrand und bringen es wieder zurück. Ergebnis: Das Bild ist gelöscht. Nun speichern wir das Bild mit dem dafür vorgesehenen Button unter einem beliebigen Namen in einem beliebigen Pfad und wiederholen das Experiment: Ergebnis: Nach dem Aufruf der innerhalb der Save-Funktion enthaltenen Funktionen Copy und Paste verschwindet das Bild nicht mehr, wenn Sie es über den Rand verschieben.
Wenn Sie die Funktionen Copy und Paste im Save-Button deaktivieren, werden Sie feststellen, dass das Bild nicht gespeichert wird.
Hier eine Kopie aus dem Listing des Quellcodes mit den Funktionen Copy, Paste und den zu deklarierenden Variablen:
Dim b As New Bitmap(600, 400) ' Größe des zu speichernden Bereiches festlegen
Dim g As Graphics = Graphics.FromImage(b)
Dim mypic As Bitmap
...
...
Private Sub copy()
'Screenshot des Bildschirms
g.CopyFromScreen(Me.Location.X + PictureBox1.Location.X + 10, _
Me.Location.Y + PictureBox1.Location.Y + 32, 0, 0, b.Size)
End Sub
Private Sub paste()
PictureBox1.Image = b
End Sub
Die Namen der zu deklarierenden Variablen sind beliebig.
Die Zahlen 600 und 400 in der ersten Zeile der Deklaration stehen für die Größe des zu kopierenden Bildausschnittes, der normalerweise der Größe der PictureBox entspricht.
Copy
Mit g.CopyFromScreen(Me.Location.X... wird der Ausschnitt mit vorgegebener Größe kopiert.
PictureBox1.Location.. gibt die Koordinaten der linken oberen Ecke des zu kopierenden Rechtecks an.
Hier fällt auf, dass zu den Koordinaten noch ein Offset (10 und 32) hinzugezählt werden muss, der der Breite des Fensterrahmens entspricht. Die Zahlen beziehen sich auf Windows 7. Es ist möglich, dass sie bei anderen Windows-Versionen variieren können.
Paste
Die Zeile PictureBox1.Image = b bringt den kopierten Bildausschnitt zurück auf die PictureBox, und zwar so, dass die linke obere Ecke des Bildes mit der linken oberen Ecke der PictureBox zusammenfällt.