^2.8.6 Zeichnen von BildernDieser Abschnitt beschäftigt sich mit der Ausgabe von fertigen Grafiken, die zur Laufzeit weder erstellt noch verändert werden müssen. Die Ausgabe erfolgt dabei immer in das aktuelle Screen-Objekt. Dabei bezieht sich der Begriff "Picture" immer auf Grafiken, die in der Picture-List gespeichert sind (siehe Kapitel 2.8.6.2, Befehle DrawPicture, GetPictureInfo). Der Begriff "Image" bezieht sich immer auf Grafiken, die in externen Bilddateien (z.B. JPG, PCX, ICO) vorliegen. Dafür stehen die Befehle DrawImage und GetImageInfo zur Verfügung. Außerdem gibt es das Image-Objekt, das diese Bilder direkt (ohne die Verwendung eines Screen-Objekts) anzeigen kann und im Objekt-Handbuch beschrieben ist.Die Routinen GetImageInfo, GetPictureInfo GetGStringInfo und GetBitmapInfo ermitteln Informationen über eine Grafik oder eine Grafikdatei in Form der folgenden Struktur: |
STRUCT GraphicInfo sizeX as WORD sizeY as WORD bitsPerPixel as WORD numImages as WORD End STRUCT |
|
Bedeutung der einzelnen Felder:
sizeX und sizeY: Abmessungen der Grafik in Pixeln bitsPerPixel: Farbtiefe
8: Bitmap, 256 Farben 24: Bitmap, True Color 0: Graphic String. Farbtiefe je nach Inhalt. Potentiell True Color
|
DIM info as GraphicInfo
info = GetImageInfo (SP_TOP, "GWICON5.ICO")
IF info.numImages = 0 THEN
Print "Kein Bild gefunden. Fehlercode: ";ErrorText$(fileError)
ELSE
Print "Abmessungen: ";info.sizeX;"x";info.sizeY;"Pixel"
Print "Bilder in der Datei:";info.numImages
IF info.bitsPerPixel = 0 THEN
Print "Typ: Graphic String"
ELSE
Print "Bitmap mit";info.bitsPerPixel;"Bit pro Pixel"
END IF
END IF
|
^2.8.6.1 Zeichnen von IconsDrawIconDrawIcon zeichnet ein Icon aus der Token-Database an die Position (x, y).
Gültige Werte für "flags":
Wird keines der Flags angegeben wird das "Standard" Icon (meist 48 x 30 Pixel, 16 Farben oder 256 Farben) verwendet. Hinweise:
|
DrawIcon "WDAT", 0, 100, 50, TOOL_ICON |
CaptionIconCaptionIcon weist einem Objekt ein Icon aus der Token-Database als grafische "Aufschrift" zu. CaptionIcon ist im Kapitel 3.1 (Die Objektbeschriftung) des Objekthandbuchs beschrieben.^2.8.6.2 Verwendung der "Picture-List"Die Picture-List ist eine komfortable Möglichkeit Grafiken im der Codedatei selbst unterzubringen und sie zur Laufzeit zu zeichnen. Beim Erstellen Ihres Programms laden Sie über das R-BASIC Menü "Extras" - "Picture-List" Bilder aus einer externen Quelle in die Picture-List. Die Bilder werden dann über ihren Namen angesprochen.
Sie können diese Bilder mit dem Befehl DrawPicture auf den Screen zeichnen oder mit der Anweisung CaptionPicture (sowohl im UI-Code als auch zur Laufzeit) als grafische Aufschrift für Objekte verwenden. Als Quellen stehen Ihnen zur Verfügung:
DrawPictureDrawPicture zeichnet eine Grafik aus der Picture-List an die Koordinaten x, y. DrawPicture setzt es die globale Variable fileError - entweder auf Null (das Bild wurde gefunden) oder auf einen Fehlerwert (das Bild wurde nicht gefunden).Syntax: DrawPicture "name" , x , y "name": Name des Bildes in der Picture-List x: x-Position der linken oberen Ecke y: y-Position der linken oberen Ecke Wenn DrawPicture im Code einer Library gerufen wird bezieht sich der Name des Bildes auf die Picture-List der Library. Das ermöglicht es unter anderem Bilder in die Picture-List von Libraries auszulagern. Beispiel: Zeichnen eines Bildes an die Position (50; 100) |
DrawPicture "Mann", 50, 100 |
Tipp: Wenn der Compiler den Namen des Bildes in der Picture-List ermitteln kann (d.h. der Name steht wie im Beispiel im Klartext da und wird nicht durch den Aufruf von Stringfunktionen wie Left$ "berechnet") wird der Namens sofort in die interne Nummer des Bildes umgerechnet. Damit muss das Bild zur Laufzeit nicht mehr gesucht werden und es wird viel schneller gezeichnet.
GetPictureInfoGetPictureInfo liest die Grafikinformationen eines Bildes aus der Picture-List aus. GetPictureInfo setzt die globale Variable fileError (Null oder Fehlercode).Syntax: info = GetPictureInfo ( "name" ) info: Variable vom Strukturtyp GraphicInfo "name": Name der Grafik in der Picture-List Beispiel: |
DIM info as GraphicInfo info = GetPictureInfo ( "Down Arrow" ) Print "Abmessungen: ";info.sizeX;"x";info.sizeY;"Pixel" |
| Beispiel: Zeichnen eines Bildes zentriert an die Position (50; 100) |
DIM info as GraphicInfo DIM x, y info = GetPictureInfo ( "Down Arrow" ) x = 50 - info.sizeX/2; y = 100 - info.sizeY/2 DrawPicture "Down Arrow", x, y |
CaptionPictureCaptionPicture weist einem Objekt ein Bild aus der Picture-List als grafische "Aufschrift" zu. CaptionPicture ist im Kapitel 3.1 (Die Objektbeschriftung) des Objekthandbuchs beschrieben.^2.8.6.3 Externe BilddateienSie können Bilder aus externen Bilddateien zur Laufzeit direkt auf den Screen von R-BASIC zeichnen. Die Routine DrawImage übernimmt dabei alle notwendigen Schritte, vom Öffnen der Datei über das Einlesen und Konvertieren in eine GEOS-kompatibles Format bis zum Zeichnen auf auf den Schirm und das abschließende Schließen der Bilddatei.DrawImageDrawImage zeichnet eine Grafik. Die Grafik wird aus einer externen Datei gelesen. Sollte die Datei mehr als ein Bild enthalten (z.B. *.GIF, *.ICO) können Sie mit dem Parameter pictNum bestimmen, welches Bild ausgelesen wird. Das erste Bild hat immer die Nummer Null. Syntax: DrawImage [stdPath,], "Path+File" , x y , [, pictNum] stdPath: Optional: Standardpfad Konstante, z.B. SP_TOP "Path+File": Dateiname, Pfade sind zulässig x: x-Position der linken oberen Ecke y: y-Position der linken oberen Ecke pictNum: Optional: Nummer des Bildes in der Datei
|
DrawImage SP_TOP, "GWICON5.ICO", 0, 0 DrawImage "BILDER\\SUNSET.JPG", 100, 100 DrawImage SP_DOCUMENT, "R-BASIC\\BILD2.PCX" 0, 20 |
GetImageInfoGetImageInfo liest die Grafikinformationen aus einer Datei aus. Wird kein Standardpfad angegeben wird die Datei im aktuellen Verzeichnis gesucht. Der Dateiname darf einen Pfadanteil enthalten. GetImageInfo setzt die globale Variable fileError (Null oder Fehlercode).Unterstützte Dateiformate: Siehe DrawImage Syntax: info = GetImageInfo ( [stdPath, ] "Path+File" ) info: Variable vom Strukturtyp GraphicInfo stdPath: Optional: Standardpfad Konstante, z.B. SP_TOP "Path+File": Dateiname, Pfade sind zulässig Beispiele: |
DIM info as GraphicInfo
info = GetImageInfo (SP_TOP, "GWICON5.ICO")
info = GetImageInfo ("BILDER\\SUNSET.JPG")
info = GetImageInfo (SP_DOCUMENT, "R-BASIC\\BILD2.PCX")
|
| Beispiel: Zeichnen eines Bildes zentriert an die Position (50; 100) |
DIM info as GraphicInfo DIM x, y info = GetImageInfo ( "BILDER\\SUNSET.JPG" ) x = 50 - info.sizeX/2; y = 100 - info.sizeY/2 DrawImage "BILDER\\SUNSET.JPG", x, y |
CaptionImageCaptionImage weist einem Objekt ein Bild aus einer externen Bilddatei als grafische "Aufschrift" zu. CaptionImage ist im Kapitel 3.1 (Die Objektbeschriftung) des Objekthandbuchs beschrieben.2.8.6.4 Bitmaps und Bitmap HandlesBitmaps werden üblicher Weise von einem BitmapContent verwaltet. Die meisten Informationen zu Bitmaps finden Sie daher auch bei der Beschreibung des BitmapContent-Objekts im Objekthandbuch. Es gibt jedoch auch die Möglichkeit Bitmaps über ein Handle anzusprechen. Mit dieser Thematik beschäftigt sich dieses Kapitel.Das Konzept der Bitmap Handles (eine Variable vom Typ HANDLE, die eine Bitmap referenziert) dient zum Austausch einer Bitmap-Grafik zwischen verschiedenen Komponenten eines BASIC Programms. Insbesondere kann eine Bitmap mit der Routine DrawBitmap in andere Objekte, z.B. eine andere Bitmap, ein beliebiges anders Screen-Objekt oder in einen Graphic String gezeichnet werden. Einige R-BASIC Libraries bieten die Möglichkeit, Bitmaps in einer externen Datendatei zu speichern oder von dort zu laden. Das folgende Bild gibt eine Übersicht über die Möglichkeiten.
Wie im Bild zu sehen gibt es sechs Möglichkeiten an ein Bitmap-Handle zu kommen:
DrawBitmapDrawBitmap zeichnet den Bitmap Grafik an die Position x, y.
Bugs ...Das GEOS System (mindestens bis Version 4.1.3) crasht, wenn folgende Bedingungen gleichzeitig zutreffen:
Wenn Sie den Parameter noFix (TRUE) angeben, wendet R-BASIC diesen Fix nicht an. Das kann z.B. in folgenden Situationen sinnvoll sein:
... und Features?Wenn Sie mit DrawBitmap eine monochrome Bitmap in eine andere Bitmap drawen, ist das Ergebnis etwas seltsam. Je nach Situation wird die Bitmap beispielsweise transparent gezeichnet, obwohl sie gar keine Maske hat, oder die Bitmapdaten landen in der Maske der Zielbitmap. Ist das nun ein Bug oder ein Feature?CropBitmapCropBitmap (engl. to crop: etwas zuschneiden) kopiert einen Ausschnitt einer Bitmap. Der Ausschnitt wird durch die übergebenen Koordinaten bestimmt. Es ist zulässig, dass die Koordinaten einen Bereich beschreiben, der teilweise außerhalb der Bitmap liegt. CropBitmap behandelt alle "Koordinatenfehler" korrekt.CropBitmap liefert ein Handle auf die Kopie. Dieses Handle muss mit FreeBitmap wieder freigegeben werden. Im Fehlerfall (der durch die angegeben Koordinaten Ausschnitt liegt komplett außerhalb der Bitmap) liefert CropBitmap ein NullHandle. CropBitmap kann verwendet werden, um die ganze Bitmap zu kopieren. Geben Sie dazu einen Ausschnitt an, der sicher größer ist, als die zu kopierende Bitmap. Syntax: <han> = CropBitmapInfo ( bmpHan , x0, y0, x1, y1 ) bmpHan: Handle auf die vorhandene Bitmap x0, y0: linke obere Ecke des zu kopierenden Ausschnitts x1, y1: rechte untere Ecke des zu kopierenden Ausschnitts Die Größe der neuen Bitmap ist (falls die Koordinaten nicht außerhalb der Bitmap liegen):
xSize = x1 - x0 + 1Beispiele: |
' In den folgenden Beispielen gilt: DIM bmpHan, newHan as HANDLE ' bmpHan soll eine Bitmap referenzieren |
' Kopieren eines 50 x 150 Pixel großen Ausschnitts newHan = CropBitmap ( bmphan, 0, 0, 49, 150 ) |
' Negative Koordinaten sind zulässig ' Der kopierte Ausschnitt ist 64 x 16 Pixel groß newHan = CropBitmap ( bmpHan, -7, -100, 63, 15 ) |
' Kopieren der kompletten Bitmap. ' x1 und y1 liegen sicher außerhalb der Bitmap newHan = CropBitmap ( bmpHan, 0, 0, 1E6, 1E6 ) |
GetBitmapInfoGetBitmapInfo liest die Grafikinformationen einer Bitmap, die durch ein Bitmap-Handle referenziert wird, aus. Die Struktur GraphicInfo wurde weiter oben beschrieben.Syntax: info = GetBitmapInfo ( bmpHan ) info: Variable vom Strukturtyp GraphicInfo bmpHan: Handle auf die Bitmap Beispiel: |
DIM info as GraphicInfo DIM bmpHan as Handle bmpHan = BitmapObj.GetBitmapHandle ' Bitmap wird nicht kopiert info = GetBitmapInfo ( bmpHan ) Print "Abmessungen: ";info.sizeX;"x";info.sizeY;"Pixel" |
ReadBitmapFromFileReadBitmapFromFile liest eine Bitmapgrafik aus einer Datei. Die Datei wird geöffnet, die Bilddaten werden kopiert und anschließend wird die Datei wieder geschlossen. ReadBitmapFromFile liefert das Handle auf die gelesene Bitmap. Das Handle muss mit FreeBitmap wieder freigegeben werden. Die globale Variable fileError wird gesetzt (Null oder Fehlercode). Im Fehlerfall liefert ReadBitmapFromFile ein NullHandle.Syntax: <han> = ReadBitmapFromFile ( fileName$ [, pictNum] ) <han>: Variable vom Typ Handle fileName$: Name der Datei mit dem Bild (Pfadanteil erlaubt). pictNum: Nummer des Bildes, falls die Datei mehr als ein Bild enthält. Default: 1 (erstes Bild lesen) ReadBitmapFromFile unterstützt die folgenden Dateiformate: BMP, RLE, DIB, ICO, PCX, GIF, FLI, FLC, JPG, TGA, SCR (BreadBox SplashScreen). Tipp: Mit Routine ReadGStringFromFile können Sie das Bild aus einer GEOS Hintergrunddatei auslesen. Tipp: Die Routine GetImageInfo liefert detaillierte Informationen über die Bilddatei. Der folgende Code liest eine PCX-Datei und nutzt ein BitmapContent-Objekt, um die Grafik anzuzeigen. Das BitmapContent Objekt legt sich eine Kopie der Bilddaten an, so dass wir das Handle mit FreeBitmap wieder freigeben können. |
SUB LoadAndShowImage() DIM h as HANDLE h = ReadBitmapFromFile ( "WOLKEN.PCX" ) IF fileError THEN RETURN MyBitmapContent.NewBitmapFormHandle h ' Kopiert die Daten FreeBitmap h ' gibt die Bitmapdaten wieder frei. End SUB |
WriteBitmapToFileWriteBitmapToFile schreibt eine Bitmap, die durch ein Handle referenziert wird, im BMP-Format in eine Datei. Der Dateiname sollte deshalb auf BMP enden. Falls die Datei bereits existiert, wird sie überschrieben. WriteBitmapToFile setzt die globale Variable fileError (Null oder Fehlercode).Syntax: WriteBitmapToFile <han> , fileName$ <han>: Handle, das eine Bitmap referenziert. fileName$: Name der anzulegenden Datei (Pfadanteil erlaubt). WriteBitmapToFile berücksichtigt eine eventuell vorhandene Maske. Transparente Pixel werden auf die Farbe Weiß bzw. auf den Index 255 (das entspricht in der Standardpalette ebenfalls Weiß) gesetzt. Eine vorhandene Palette wird ebenfalls berücksichtigt. Der folgende Code schreibt die Bitmap eines BitmapContent Objekts in eine Datei. Weil die Methode GetBitmapHandle nur das Handle liefert, die Daten aber nicht kopiert, dürfen wir das Handle NICHT mit FreeBitmap freigeben. |
SUB WriteImageToFile ( ) DIM h as Handle h = MyBitmapContent.GetBitmapHandle WriteBitmapToFile h, "BILD1.BMP" End SUB |
SaveBitmapAsBackgroundSaveBitmapAsBackground schreibt eine Bitmap, die durch ein Handle referenziert wird, als GEOS Hintergrunddatei. Falls die Datei bereits existiert, wird sie überschrieben. WriteBitmapAsBackground setzt die globale Variable fileError (Null oder Fehlercode).Syntax: SaveBitmapAsBackground <han> , fileName$ <han>: Handle, das eine Bitmap referenziert. fileName$: Name der anzulegenden Datei (Pfadanteil erlaubt). FreeBitmapFreeBitmap gibt das Handle und die komplette Bitmap wieder frei. Der von Bitmap belegte Speicherplatz wird freigegeben. FreeBitmap darf nur auf Handles angewendet werden, von ClipboardGetBitmap, ReadBitmapFromFile, CropBitmap oder der Methode CopyBitmap belegt wurden!Syntax: FreeBitmap <han> <han>: Handle, das die Bitmap referenziert. Tipp: Um sicherzustellen, dass das System nicht crasht, falls das Handle irrtümlich noch einmal mit DrawBitmap verwendet wird, können Sie es nach dem Freigeben durch FreeBitmap () mit der Anweisung "han = NullHandle()" löschen. DrawBitmap gibt dann nur eine entsprechende Fehlermeldung aus. ClipboardGetBitmapClipboardGetBitmap holt eine Bitmap aus der Zwischenablage. Die Bitmap kann sofort mit DrawBitmap gezeichnet werden. Das von ClipboardGetBitmap gelieferte Handle muss mit FreeBitmap wieder freigegeben werden.Syntax: <han> = ClipboardGetBitmap( ) Wird keine Bitmap im Clipboard gefunden, so liefert ClipboardGetBitmap ein NullHandle. ClipboardGetBitmap setzt die globale Variable clipboardError (Null oder Fehlercode). Sie können vorher mit ClipboardTest prüfen, ob sich eine Bitmap im Clipboard befindet. Beispiel: |
DIM bmpHan AS HANDLE
IF ClipboardTest (0, 7) THEN! manufID = 0, format = 7
bmpHan = ClipboardGetBitmap()
End IF
<....>
z.B. DrawBitmap bmpHan, 0, 0
FreeBitmap bmpHan ' Nicht vergessen
|
ClipboardPutBitmapClipboardPutBitmap kopiert einen Bitmap, die durch ein Bitmap-Handle referenziert wird, in die Zwischenablage. Von dort kann sie in andere Applikationen eingeklebt oder von anderen R-BASIC Objekten gelesen werden.Syntax: ClipboardPutBitmap <han> <han>: Handle, das eine Bitmap referenziert. Beachten Sie, dass Sie eine Bitmap, die sich in einem BitmapContent-Objekt befindet, auch direkt mit der Methode ClpCopy in die Zwischenablage kopieren können. Beispiel. Wir nehmen an, dass die Routine FindABitmapHandle ein Bitmap-Handle zurückgibt. |
DIM bmpHan AS HANDLE bmpHan = FindABitmapHandle() ClipboardPutBitmap bmpHan |
^ |