4.16 CanvasÜberblickEin Canvasobjekt (engl: Leinwand) dient dazu, eine Grafik anzuzeigen. Diese Grafik liegt nicht als vorgefertigtes Bild vor, sondern wird zur Laufzeit gezeichnet. Bei Bedarf kann sich die vom Canvasobjekt angezeigte Grafik also ändern. Dazu verfügt das Canvas Objekt über folgende Fähigkeiten:
Verwenden Sie ein Canvasobjekt, wenn Sie eine einfache Grafik, z.B. ein Logo, ein Schema oder einen grafisch gestalteten Text, darstellen wollen, die sich im Programmablauf nicht oder nur selten ändern. Für grafische Ausgaben, die während des Programmablaufs ständig angepasst werden müssen, wie Statusmeldungen (z.B. "Schritt 5 von 10") oder bewegte Grafiken ist das Canvasobjekt nicht optimal. Beispiele zur Verwendung des Canvas-Objekts finden Sie im Ordner "Beispiel\Objekte\Grafik". Abstammung:
Das Canvasobjekt erbt alle Eigenschaften und Fähigkeiten der GenericClass. Von besonderer Bedeutung sind dabei die Fähigkeiten zum Geometriemanagement (siehe Kapitel 3.3). Insbesondere die Hints fixedSize, initialSize, ExpandWidth und/oder ExpandHeight werden häufig genutzt, da das Canvas Objekt "von sich aus" keine vorgegebene Größe hat und sonst möglicherweise unsichtbar klein ist. Spezielle Instance-Variablen:
Methoden:
Action-Handler-Typen:
MausunterstützungDas Canvasobjekt unterstützt die Behandlung von Mausereignissen. Eine detaillierte Beschreibung der Arbeit mit der Maus finden Sie im Handbuch "Spezielle Themen", Kapitel 17.Es ist möglich, innerhalb eines Maushandlers Grafiken oder Text auf den Bildschirm auszugeben. Dazu müssen Sie das Objekt explizit zum Screen machen. Häufig werden Sie außerdem die Maus grabben. Ein entsprechendes Beispiel ("Canvas Maus Demo") finden Sie im Ordner "Beispiel\Objekte\Grafik". Beachten Sie aber, dass das Canvas-Objekt die Grafik- und Textausgaben nicht abspeichert! Sie werden nicht wieder gezeichnet, wenn das Objekt sich selbst neu darstellt.
Der gepufferte ModusIm gepufferten Modus speichert das Objekt die darzustellende Grafik zwischen. Dadurch muss nicht jedes Mal der OnDraw-Handler gerufen werden, wenn sich das Objekt neu auf dem Bildschirm darstellen muss. Um den gepufferten Modus zu aktivieren verwenden Sie die Instancevariable buffered. Sie müssen dem Objekt auch mitteilen, wie groß die zu speichernde Datenmenge ungefähr (!) ist. Dazu verwenden Sie die die Instancevariable bufferedDataSize.Es wird empfohlen, den gepufferten Modus zu verwenden.
Verwenden des OnDraw HandlersDer OnDraw-Handler übernimmt die Darstellung der vom Objekt angezeigten Grafik. Das gilt sowohl für den normalen als auch für den gepufferten Modus, im gepufferten Modus wird der OnDraw-Handler genau einmal gerufen.Während der OnDraw Handler läuft, wird das Canvas Objekt zum Screen, das heißt, alle Grafikausgaben gehen über dieses Objekt direkt auf den Bildschirm. Sie können alle Grafikbefehle verwenden, Farben ändern, Texte ausgeben usw., selbst Manipulationen des Koordinatensystems (siehe Kapitel 2.3.3) sind möglich. Falls ein globaler Screen gesetzt ist (siehe Kapitel 2.3) wird dessen Status vorher gesichert und anschließend wieder hergestellt, so dass es keine gegenseitige Beeinflussung geben kann. Mit einer Ausnahme: Alle Einstellungen rund um den Block-Grafik-Modus (siehe Handbuch "Spezielle Themen", Kapitel 2.5) sind immer global. Ändern Sie hier innerhalb eines OnDraw Handlers etwas (z.B. durch Laden eines anderen Zeichensatzes) wirkt sich das auf alle anderen Teile des Programms aus. Beispiel UI Code: | |||||||||||||||||||||||
Canvas DemoCanvas fixedsize = 300, 200 OnDraw = DemoDraw END OBJECT | |||||||||||||||||||||||
|
Beispiel Handler: | |||||||||||||||||||||||
DRAWACTION DemoDraw Paper 203 CLS graphic.linewidth = 5 Circle 150, 100,50, LIGHT_BLUE Print atxy 110,100;"Hallo" END ACTION | |||||||||||||||||||||||
|
Das Canvasobjekt führt ein automatisches Clipping aus, d.h. die Grafikteile, die über den Rand des Objekts ragen, werden nicht gezeichnet.
Sie können die aktuelle Größe des Zeichenbereichs ermitteln, indem Sie die Systemvariablen MaxX und MaxY abfragen. Da ist insbesondere dann hilfreich, wenn das Objekt seine Größe verändern kann, z.B. wenn die Hints ExpandWidth und ExpandHeight gesetzt sind. Beispiel UI: | |||||||||||||||||||||||
Canvas DemoCanvas initialSize = 150, 150 OnDraw = DrawCircleHandler ExpandWidth ExpandHeight END OBJECT | |||||||||||||||||||||||
|
Beispiel Code. Es entsteht ein Viertelkreis.
| |||||||||||||||||||||||
DRAWACTION DrawCircleHandler FillEllipse 0, 0, 2*MaxX, 2*MaxY, LIGHT_BLUE END ACTION | |||||||||||||||||||||||
Beschreibung der InstancevariablenOnDrawDie Instance-Variable OnDraw enthält den Namen des Handlers, der die Grafik zeichnen soll. Dieser muss als DrawAction vereinbart sein. Der Wert wird üblicherweise im UI-Code gesetzt.
Syntax UI-Code: OnDraw = <Handler>
Schreiben: <obj>.OnDraw = <Handler>
Bei Bedarf kann der OnDraw-Handler auch zur Laufzeit (im BASIC-Code) gesetzt werden. In diesem Fall stellt sich das Objekt automatisch neu dar. Hinweis: Der neue OnDraw Handler wird erst ausgeführt nachdem der Handler, der die Zuweisung ausgeführt hat beendet ist!
defaultColorDie Instance-Variable defaultColor enthält die Farben, die beim Aufruf des OnDraw Handlers eingestellt werden. Dabei setzt R-BASIC die Farben folgendermaßen:
Hintergrundfarbe: bg
Text-, Linien- und Flächenfarbe: fg
Das ist prinzipiell so, als würde automatisch die Anweisung "COLOR fg, bg" ausgeführt, kostet aber deutlich weniger Zeit.
Syntax UI-Code: defaultColor = fg, bg
fg: Vordergrund (foreground)
bg: Hintergrund (background)
fg und bg müssen Indexfarben sein.
RGB-Farben sind nicht zulässig.
Lesen: <numVar> = <obj>.defaultColor (0) ' fg
<numVar> = <obj>.defaultColor (1) ' bg
Schreiben: <obj>.defaultColor = fg, bg
Canvas Objekte ohne die Anweisung defaultColor verwenden die Farben "schwarz auf weiß". bufferedDie Instancevariable buffered legt fest, ob das Canvasobjekt die anzuzeigende Grafik zwischenspeichert (buffered = TRUE, "gepufferter" Modus) oder nicht (buffered = FALSE, normaler Modus). FALSE ist der Defaultwert.Wenn Sie den gepufferten Modus aktivieren sollten Sie ebenfalls die Instancevariable bufferedDataSize (siehe unten) im Blick haben.
Syntax UI-Code: buffered = TRUE
Schreiben: <obj>.buffered = TRUE | FALSE
Lesen: <numVar> = <obj>.buffered
Ändern Sie den Wert der Instancevariablen buffered von FALSE auf TRUE oder von TRUE auf FALSE, so ruft das Objekt seinen OnDraw-Handler und stellt sich neu auf dem Bildschirm dar. bufferedDataSizeIm gepufferten Modus fordert das Objekt Speicher (in einer Datei) an, um die darzustellende Grafik zu speichern. BufferedDataSize enthält die Information, wie groß der benötigte Speicher ungefähr (!) ist. Der Wert ist nicht kritisch. Wenn Sie hier einen falschen Wert angeben, passiert im Allgemeinen nichts.
Syntax UI-Code: bufferedDataSize = <Wert>
Schreiben: <obj>.bufferedDataSize = <Wert>
Lesen: <numVar> = <obj>.bufferedDataSize
<Wert>: numerische Konstante, siehe aus der Tabelle unten
Der Defaultwert für bufferedDataSize ist DS_TINY. Das ist ein sinnvoller Wert, wenn Sie nur Grafikbefehle verwenden und keine Bitmapgrafiken ausgeben. Die folgende Tabelle enthält die zulässigen Werte:
Beispiele, in welchen Situationen welche Datenmengen zu erwarten sind, finden Sie im Programmierhandbuch, Kapitel 2.8.5, bei der Beschreibung des Befehls StartRecordGS. DirtyDie Methode Dirty (engl: schmutzig) bewirkt, dass sich das Objekt neu darstellt, indem es seinen OnDraw Handler ruft. Verwenden Sie diese Methode wenn sich Daten, die zur Darstellung des Objekts relevant sind, geändert haben. Wenn das Objekt z.B. eine Pyramide darstellt und die Höhe der Pyramide hat sich geändert, dann müssen Sie die Dirty-Methode rufen, damit das Objekt die Pyramide mit der neuen Höhe zeichnet.Syntax im BASIC Code: <obj>.Dirty Die Dirty Methode arbeitet auch im gepufferten Modus. Das Objekt gibt die alte gepufferte Grafik automatisch frei und speichert die neue ab. Tipps und Tricks
^ |