^2.8.4 Die Systemvariable "graphic" : Mixmodes und mehrAlle Parameter des Grafik-Systems vom R-BASIC lassen sich über die Felder der Systemvariablen graphic einstellen. Die Verwendung dieser Variablen gestattet einen wesentlich detaillierten Zugriff auf die Grafik-Eigenschaften, als die Befehle COLOR, PAPER und INK. GEOS verwaltet getrennte Farben für Text, Linien und Flächen. R-BASIC speichert zusätzlich noch eine Farbe für den Hintergrund (z.B. von Textausgaben, siehe PAPER-Befehl).graphic ist vom Typ GraphicDrawStruct, der folgendermaßen definiert ist: |
STRUCT GraphicDrawStruct mixMode AS Word backColor AS DWord lineColor AS DWord lineDrawMask AS Word lineWidth, lineStyle AS Word lineEnd, lineJoin AS Word areaColor AS DWord areaDrawMask AS Word textColor AS DWord textDrawMask AS Word drawFlags AS Word reserve(6) AS Word 'reserviert für zukünftige Erweiterungen END STRCUT |
|
Die folgende Tabelle enthält die Bedeutung der einzelnen Felder, sortiert nach der Wichtigkeit / Häufigkeit ihrer Verwendung. Häufig verwendete Felder
Weniger häufig verwendete Felder
Hinweis: Während der Ausführung einer PRINT-Anweisung werden einige Felder der graphic-Variablen intern zeitweise geändert, dann aber wieder zurück gesetzt. Das kann bedeutsam sein, wenn die Printliste Funktionsaufrufe enthält. Tabelle der Lininenstile: Erlaubte Werte für das Feld lineStyle
Tabelle der Füllmuster: Erlaubte Werte für die Felder areaDrawMask, lineDrawMask und textDrawMask.
Beispiele für Füllmuster. Weitere Beispiele finden Sie im Anhang C.
Der Mix-ModeIm Normalfall geht man davon aus, dass neu gezeichnete Linien oder Flächen vorhandene Grafiken überschreiben. Das muss aber nicht so sein. Mit dem Feld graphic.mixMode können Sie bestimmen, wie neu gezeichnete Linien oder Flächen mit dem bereits vorhandenen Hintergrund verknüpft werden sollen. Dabei wird der Farbwert jedes Pixels ermittelt, indem der Farbwert des an dieser Stelle bereits vorhandenen Pixels über eine logische Operation mit dem Farbwert der Zeichenfarbe verknüpft wird.Von besonderer Bedeutung sind die Modi MM_XOR und MM_INVERT. In diesen Modi wird z.B. eine Linie beim ersten Zeichnen erscheinen und beim nochmaligen Zeichnen wieder gelöscht. So kann man z.B. "Gummi-Linien" realisieren, ohne den Hintergrund zu beschädigen. Im Zweifelsfall verwenden Sie MM_INVERT. Achtung! graphic.mixMode wirkt nicht bei Textausgaben (PRINT) und bei der Ausgabe von Bildern (DrawImage, DrawPicture, DrawBitmap, DrawIcon). Tabelle der Mix-Modes: Erlaubte Werte für das Feld mixMode
Der Mix-Mode verwendet logische Operationen (AND, OR, XOR) zur Verknüpfung der Farbwerte. Für System-Farben (beschrieben durch einen Index) wirkt die Verknüpfung auf den Index. Deshalb hängen die Ergebnisse einiger Mix-Modi davon ab, welche Farbtiefe verwendet wird. Das kann insbesondere in dem häufigen Fall, dass eine 256-Farb-Bitmap gemeinsam mit einem True-Color Bildschirm verwendet wird, zu unerwarteten Ergebnissen führen (die Resultate in der Bitmap und auf dem Bildschirm unterscheiden sich). Hier hilft nur ausprobieren, ob das Ergebnis für die eigenen Zwecke geeignet ist oder nicht. R-BASIC reicht an dieser Stelle einfach das vom GEOS-System bereitgestellte Verhalten durch.
2.8.5 Arbeit mit Graphic StringsEin Graphic String (im Folgenden kurz GString) ist eine Folge von Grafikbefehlen oder Textausgaben, die gemeinsam gespeichert werden. Dieser GString kann später beliebig oft "abgespielt" werden. Dabei werden die enthaltenen grafischen Kommandos mit hoher Geschwindigkeit ausgeführt, viel schneller als dies als Folge von BASIC-Anweisungen möglich ist. Das folgende Bild gibt einen Überblick über die Möglichkeiten, die R-BASIC zur Arbeit mit GStrings bietet.
Es gibt mehrere Möglichkeiten an eine GString zu kommen. In vielen Fällen werden Sie ihn selbst aufzeichnen. Dazu müssen Sie zunächst mit StartRecordGS die Aufzeichnung starten. StartRecordGS liefert ein Handle zurück, mit dem Sie später den GString wiedergeben können. Intern wird der GString in einer Datei gespeichert, die R-BASIC zur Verfügung stellt. Deswegen müssen Sie die ungefähre Datenmenge, die der GString aufnehmen soll, angeben. Ab diesem Zeitpunkt gehen alle Grafik- und Textausgaben, die sonst auf den Bildschirm gehen würden, in den GString und werden aufgezeichnet. Es sind grundsätzlich alle Text- und Grafikbefehle erlaubt. Das schließt explizit die Wiedergabe anderer GStrings ein. Die Grafikbefehle werden dabei in den neuen GString kopiert. Mit EndRecordGS wird der Aufzeichnungsmodus beendet. Der GString kann nun mit DrawGS ausgegeben werden. Die Routine GetGStringInfo liefert Informationen über einen GString, z.B. seine Abmessungen. Damit können Sie ihn z.B. zentriert oder rechtsbündig an eine bestimmte Position zeichnen. Außerdem können Sie GStrings mit CaptionGString als grafische Captions für Objekte und mit ItemGString ( ) als grafische Listeneinträge in DynamicList Objekten verwenden. Statt einen GString selbst aufzuzeichnen können Sie ihn mit ClipboardGetGS aus der Zwischenablage zu holen oder mit ReadGStringFromFile aus einer GEOS Hintergrunddatei lesen. Außerdem bieten die R-BASIC Libraries "VMFiles" und "ResFile" Funktionen an, einen GString in eine Datei zu schreiben bzw. ihn von dort zu laden. Sie haben weiterhin die Möglichkeit einen GString mit ClipboardPutGS in die Zwischenablage zu kopieren. Wenn Sie den GString nicht mehr benötigen müssen Sie ihn meist mit FreeGS freigeben. Beachten Sie dazu die Dokumentatzion der Routine, die den GString angelegt hat! Mit FreeGS wird der GString aus der Datei, die ihn enthält, gelöscht. Beachten Sie, dass ein GString bei einem System Shutdown nicht automatisch gelöscht wird, das Handle auf ihn steht nach einem Systemneustart aber nicht mehr zur Verfügung. Sie sollten deswegen alle "globale" GStrings, die von einer Routine angelegt und von anderen verwendet werden, im OnExit-Handler des Application-Objekts freigeben.
StartRecordGSStartRecordGS beginnt die Aufzeichnung eines GStrings. Der GString wird als unsichtbarer Screen gesetzt, die aktuellen Screendaten werden gesichert und nach EndRecordGS wieder hergestellt. Alle Text- und Grafikausgaben gehen ab sofort in den GString und werden aufgezeichnet.Dabei gelten anfangs die folgenden Einstellungen:
Syntax: <hanVar> = StartRecordGS ( dataSize ) <hanVar> = StartRecordGS ( ) ' entspricht DS_TINY. Die Klammern sind erforderlich! <hanVar> Variable vom Typ HANDLE. Speichert die Referenz auf den GString Das von StartRecordGS zurückgegeben Handle wird für die anderen GString-Befehle benötigt. Der Parameter dataSize bestimmt die ungefähre Größe der GStringdaten. Damit kann R-BASIC abschätzen, wieviel Platz es in der Datei, die den GString aufnehmen soll, reservieren muss. Wenn sich schon viele Daten in der Datei befinden (z.B. Bitmaps von BitmapContent-Objekten oder andere GStrings) kann R-BASIC gegebenen Falls eine neue Datei anlegen. Allerdings ist der Wert nicht kritisch. Geben Sie DS_TINY an und verbrauchen trotzdem ein Megabyte passiert im Allgemeinen nichts. Haben Sie aber viele GStrings, Bitmap-Objekte oder Objekte im gepufferten Modus (z.B. Canvas mit buffered = TRUE gesetzt) gleichzeitig sollten Sie dem Wert etwas mehr Aufmerksamkeit widmen. Der Defaultwert für dataSize ist DS_TINY. Die folgende Tabelle enthält die zulässigen Werte.
Beispiele:
EndRecordGSEndRecordGS beendet die Aufzeichnung eines GString. Die vor dem Aufruf von StartRecordGS geltenden Screen- und Grafikeinstellungen werden wieder hergestellt. Ab sofort kann der GString verwendet werden.Syntax: EndRecordGS <han> <han>: Handle, das von StartRecordGS geliefert wurde. DrawGSDrawGS zeichnet den GString an die Position x, y.
FreeGSFreeGS gibt das Handle und den GString wieder frei. Der vom GString belegte Speicherplatz wird freigegeben.
Tipp: Um sicherzustellen, dass das System nicht crasht, falls das Handle irrtümlich noch einmal mit DrawGS verwendet wird können Sie es nach dem Freigeben durch FreeGS () mit der Anweisung "han = NullHandle()" löschen. R-BASIC gibt dann bei einer irrtümlichen Verwendung mit DrawGS nur eine entsprechende Meldung aus. Wichtig: Wenn Sie eine Library-Routine verwenden um einen GString zu erzeugen, lesen Sie bitte die Dokumentation der Routine sorgfältig, um zu entschieden, ob Sie diesen GString mit FreeGS freigeben müssen oder nicht! Beispiel: Die Routine verwendet einen GString um einem Objekt eine Grafik als Caption zuzuweisen. Dazu verwenden wir die Instancevariable CaptionGString. Das ist ein üblicher Weg um einfache Grafiken, die zur Laufzeit gelegentlich geändert werden müssen, darzustellen. Die Zeile "MyObj.CaptionGString = gsHan" kopiert den GString in das Objekt, so dass wir ihn mit "FreeGS gsHan" wieder freigeben können (und müssen!). |
SUB SetCaption ( ) DIM gsHan as HANDLE gsHan = StartRecordGS ( ) FillRect 0, 0, 48, 32, LIGHT_BLUE Rectangle 0, 0, 48, 32, BLUE INK WHITE Ellipse 4, 12, 14, 22 Ellipse 7, 5, 17, 15 Ellipse 22, 18, 32, 28 Ellipse 32, 14, 42, 24 Ink BLACK printfont.style = TS_BOLD Print atxy 25,1;"ab" EndRecordGS gsHan MyObj.CaptionGString = gsHan FreeGS gsHan End SUB |
|
Beispiel: Verwendung eines GString, dessen Handle in einer globalen Variable gespeichert ist. Der GString wird beim Schließen des Programms freigegeben.
Definition der globalen Variablen |
DIM globalGS AS HANDLE |
| UI-Code Ausschnitt |
Application DemoApplication <.....> OnExit = ExitHandler End Object |
| Anlegen des GString |
SUB CreateGS ( ) globalGS = StartRecordGS() Ellipse 50, 50, 100, 100, RED Print atxy 0, 20; "Hallo BASIC" EndRecordGS ( globalGS ) END SUB |
| Verwendung des GString |
SUB DrawGlobalGS() DrawGS globalGS, 20, 30 DrawGS globalGS, 10, 60 DrawGS globalGS, 50, 45 End SUB |
| Zugehöriger OnExit-Handler zum freigeben des GString. FreeGS ignoriert leere Handles. Deswegen brauchen wir globalGS NICHT auf NullHandle() zu prüfen. |
SYSTEMACTION ExitHandler FreeGS globalGS END ACTION |
GetGStringInfoGetGStringInfo liest die Grafikinformationen eines Graphic String aus. Dazu wird eine Variable vom Strukturtyp GraphicInfo belegt. Diese Struktur ist im Abschnitt 2.8.6 (Zeichnen von Bildern) beschrieben.Syntax: info = GetGStringInfo ( gsHan ) info: Variable vom Strukturtyp GraphicInfo gsHan: Handle auf den GString Beispiel: |
DIM info as GraphicInfo DIM gsHan as Handle gsHan = StartRecordGS() Rectangle 20, 20, 50, 100 EndRecordGS gsHan info = GetGStringInfo ( gsHan ) Print "Abmessungen: ";info.sizeX;"x";info.sizeY;"Pixel" FreeGS gsHan |
| Beispiel: Zeichnen eines GString (in gsHan) zentriert an die Position (50; 100) |
DIM info as GraphicInfo DIM x, y info = GetGStringInfo ( gsHan ) x = 50 - info.sizeX/2; y = 100 - info.sizeY/2 DrawGS gsHan, x, y |
ClipboardGetGSClipboardGetGS holt einen GString aus der Zwischenablage. Graphic Strings sind ein universelles Grafikformat unter GEOS. Die Grafik in der Zwischenablage kann z.B. aus GeoWrite, GeoDraw oder dem Sammelalbum kommen. Der GString kann sofort mit DrawGS gezeichnet werden. ClipboardGetGS ist damit analog zur Kombination StartRecordGS / EndRecordGS. Das von ClipboardGetGS gelieferte Handle muss ebenfalls mit FreeGS wieder freigegeben werden.
Wird kein GString im Clipboard gefunden so liefert ClipboardGetGS ein NullHandle. ClipboardGetGS setzt die globale Variable clipboardError (Null oder Fehlercode). Sie können vorher mit ClipboardTest prüfen, ob sich ein GString im Clipboard befindet. Beispiel: |
DIM gsHan AS HANDLE
IF ClipboardTest (0, 1) THEN! manufID = 0, format = 1
gsHan = ClipboardGetGS()
End IF
<....> z.B. DrawGS gsHan, 0, 0
FreeGS gsHan ' Nicht vergessen
|
ClipboardPutGSClipboardPutGS kopiert einen GString in die Zwischenablage. Von dort kann er dann z.B. in GeoDraw eingeklebt werden.Syntax: ClipboardPutGS <han> <han>: Handle, das von StartRecordGS geliefert wurde. Beispiel: |
DIM gsHan AS HANDLE gsHan = StartRecordGS () Rectangle 20, 20, 50, 100, BLACK FillEllipse 30, 30, 40, 90, RED EndRecordGS gsHan ClipboardPutGS gsHan FreeGS gsHan ' Nicht vergessen |
SaveGStringAsBackgroundSaveGStringAsBackground schreibt einen GString als GEOS Hintergrunddatei. Falls die Datei bereits existiert wird sie überschrieben. WriteGStringToFile setzt die globale Variable fileError (Null oder Fehlercode).Syntax: SaveGStringAsBackground <han> , fileName$ <han>: Handle, das den GString referenziert. fileName$: Name der anzulegenden Datei (Pfadanteil erlaubt). ReadGStringFromFileReadGStringFromFile liest (kopiert) einen GString aus einer Datei. Aktuell werden nur GEOS Hintergrunddateien unterstützt. ReadGStringFromFile liefert das Handle auf den gelesenen GString. Das Handle muss mit FreeGString wieder freigegeben werden. Die globale Variable fileError wird gesetzt (Null oder Fehlercode). Im Fehlerfall liefert ReadGStringFromFile ein NullHandle.Syntax: <han> = ReadGStringFromFile ( fileName$ [, pictNum] )
<han>: Variable vom Typ Handle fileName$: Name der Datei mit dem Bild (Pfadanteil erlaubt). ^ |