4.17 Image
4.17.1 ÜberblickEin Imageobjekt dient dazu, eine Grafik anzuzeigen, die als fertiges Bild in einer Datei oder in der PictureList vorliegt. Der Programmierer muss nichts weiter tun als die anzuzeigende Grafik zu spezifizieren. Um den Rest kümmert sich das Imageobjekt. Sie können dem Objekt auch jederzeit eine andere Grafik zuweisen, es gibt keinen speziellen Befehl um den von der aktuellen Grafik eventuell belegten Speicher freizugeben. Darum kümmert sich das Objekt automatisch.Das Imageobjekt kann auch Animationen ohne weiteres Zutun des Programmierers abspielen. Dabei können Sie festlegen, ob die Animation automatisch oder erst durch einen Programmbefehl gestartet werden soll. Unterstützte Grafik-Formate:
Abstammung:
Spezielle Instance-Variablen:
Methoden:
Das Imageobjekt 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 Image Objekt "von sich aus" keine vorgegebene Größe hat und sonst möglicherweise unsichtbar klein ist. Beachten Sie in diesem Zusammenhang auch die Instancevariable "autoSize". MausunterstützungDas Imageobjekt 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 auf das Imageobjekt übertragbares Beispiel finden Sie hier: "Beispiel\Objekte\Grafik\Canvas Maus Demo". Beachten Sie aber, dass das Imageobjekt die Grafik- und Textausgaben nicht abspeichert! Sie werden nicht wieder gezeichnet, wenn das Objekt sich selbst neu darstellt.
ClipboardDas Imageobjekt kann die aktuell dargestellte Grafik mit der Methode ClpCopy in die Zwischenablage kopieren. Diese Methode ist für alle Objektklassen definiert. Lesen aus der Zwischenablage wird nicht unterstützt.Um herauszufinden, ob das Objekt eine Grafik darstellt, die ins Clipboard kopiert werden kann, können Sie die Methode ClpTestCopy verwenden. Diese Methode liefert TRUE wenn keine Grafik spezifiziert wurde, wenn die Grafikdatei nicht gelesen werden konnte oder in jedem anderen Fehlerfall.
Kopieren oder Drucken der GrafikUm die aktuell dargestellte Grafik auf einen Drucker auszugeben verwenden Sie bitte die Routine PrintObj, die im Kapitel 4.14.7 (Drucken Spezieller Objekte) im Objekthandbuch beschrieben ist. Diese Routine können Sie auch verwenden, um die aktuell angezeigte Grafik auf das aktuelle Screenobjekt zu "drucken". Der Screen kann dabei eine Bitmap, ein GString oder was auch immer sein. Alternativ können Sie die Grafik zunächst ins Clipboard kopieren und vorn dort z.B. mit den Befehlen ClipboardGetGS oder ClipboardGetBitmap holen.^4.17.2 Anzeige von BildernGrafiken für das Image-Objekt können aus drei Quellen stammen: aus externen Bilddateien (Instancevariable ImageFile), aus der PictureList (Instancevariable ImagePicture) oder aus einer Resource-Datei (Instancevariable ImageResource). Außerdem haben Sie die Möglichkeit, Informationen über die angezeigte Grafik oder die Grafikdatei zu erhalten (Instancevariablen numPicts, pictNum, imgInfo und imgState).Die Instancevariable ImageFile kann auch eine Animation spezifizieren. Die Details dazu werden im nächsten Abschnitt besprochen. Die Methode Redraw ermöglicht ein Neuzeichnen der angezeigten Grafik.
ImageFileImageFile enthält den kompletten Pfad zur anzuzeigenden Datei. Wenn das Programm startet öffnet das Imageobjekt die Datei, lädt (kopiert) die Grafik und schließt die Datei wieder. Um zu prüfen, ob das Objekt ein Bild geladen hat können Sie die Instancevariable "numPicts" abfragen.Wenn ImageFile eine Animation spezifiziert kann die Animation automatisch gestartet werden (siehe unten, Instancevariable "autoStart"). Während die Animation läuft bleibt die Datei die ganze Zeit offen.
Syntax UI-Code: imageFile = stdPath, "file"
Schreiben: <obj>.imageFile = stdPath, "file"
Lesen: --
stdPath: Standardpfad-Konstante oder Null, siehe Tabelle.
"file" Name der anzuzeigenden Datei.
Pfadangaben sind zulässig. Siehe Tabelle.
Wird der Wert zur Laufzeit zugewiesen stellt sich das Objekt sofort neu dar. Außerdem wird die globale Variable fileError gesetzt. Zulässige Kombinationen für stdPath und "file"
Beispiele | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imageFile = SP_DOCUMENT, "IMAGES\\SUNSET.JPG" End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imageFile = SP_USER_DATA, "BACKGRND\\Froggy Bumps" End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoImage.imageFile = 0, "D:\\Bilder\\TEST3.RLE" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImagePictureImagePicture enthält den Namen einer Grafik aus der PictureList. Die Grafik kann eine Bitmap oder ein GString sein. Die Verwendung der PictureList wird im Programmierhandbuch, Kapitel 2.8.6.2 (Verwendung der "PictureList") beschrieben.
Syntax UI-Code: imagePicture = "name"
Schreiben: <obj>.imagePicture = "name"
Lesen: --
"name" Name der Grafik in der PictureList
Wird der Wert zur Laufzeit zugewiesen stellt sich das Objekt sofort neu dar. Um zu prüfen, ob das Objekt das Bild in der PictureList gefunden hat können Sie die Instancevariable "numPicts" abfragen. Beispiele | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imagePicture = "Segler" End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoImage.imagePicture = "Diagram" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImageResourceImageResource ermöglicht dem Imageobjekt Grafiken (Bitmaps und GStrings) aus einer Resource-Maker Datei ohne weitere Unterstützung des Programmierers anzuzeigen. Der Resource-Maker ist © by Rabe-Soft und kann von der Website des Programmierers (www.rbettsteller.de) heruntergeladen werden.Wenn das Programm startet öffnet das Imageobjekt die Datei, lädt (kopiert) die Grafik und schließt die Datei wieder. Um zu prüfen, ob das Objekt ein Bild geladen hat können Sie die Instancevariable "numPicts" abfragen.
Syntax UI-Code: imageResource = stdPath, "file", "name"
Schreiben: <obj>.imageResource = stdPath, "file", "name"
Lesen: --
stdPath: Standardpfad-Konstante oder Null, siehe ImageFile.
"file" Name der Resource-Datei. Pfadangaben sind zulässig.
Siehe ImageFile.
"name" Name des Grafik-Eintrags in der Resource-Datei.
Wird der Wert zur Laufzeit zugewiesen stellt sich das Objekt sofort neu dar. Außerdem wird die globale Variable fileError gesetzt. Achtung! Falls die spezifizierte Datei keine gültige Resource-Datei ist crasht das System! Sie können im Zweifelsfall das Token abfragen. Beispiele | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imageResource = SP_DOCUMENT, "IMAGES\\Test Resource", "Erde" End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage
imageResource = SP_USER_DATA,\
"R-BASIC\\BIN\\Rainer\\SuperGame\\Super ImgResorce",\
"SiegerAnimation"
End Object
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoImage.imageResource = 0, "D:\\TestResource", "Grafik1" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
numPictsDie Instancevariable numPicts enthält die Anzahl der Bilder in der Bilddatei. Kommt das Bild aus einer Resource oder aus der PictureList enthält numPicts den Wert 1. Im Fehlerfall oder wenn noch kein Bild zugewiesen wurde enthält numPicts den Wert Null. Sie können numPicts verwenden, um zu prüfen ob das Objekt ein Bild anzeigt oder nicht. Außerdem können Sie die globale Variable fileError abfragen. Verwenden Sie die Routine ErrorText$() um den Fehlercode in fileError in einen verständlichen Text zu übersetzen.
Syntax UI-Code: --
Schreiben: --
Lesen: <numVar> = <obj>.numPicts
pictNumDie Instancevariable pictNum enthält die Nummer des gerade angezeigten Bildes für den Fall, dass die Datei mehr als ein Bild enthält. Das kann z.B. bei ICO Dateien zutreffen. Das erste Bild hat die Nummer Null. Es gilt also immer pictNum < numPicts. Für Bilder aus einer Resource oder aus der PictureList ist der Wert immer Null. Weisen Sie der Instancevariablen einen ungültigen Wert zu, so wird sie automatisch auf Null gesetzt.
Syntax UI-Code: pictNum = num
Schreiben: <obj>.pictNum = num
Lesen: <numVar> = <obj>.pictNum
ImgInfoDie Instancevariable imgInfo liefert eine Struktur des Typs GraphicInfo. Diese enthält detaillierte Informationen über das aktuell vom Objekt angezeigte Bild. Die Struktur GraphicInfo ist im Anhang C beschrieben.
Syntax Lesen: <var> = <obj>.imgInfo
var: Variable vom Typ GraphicInfo
Die Struktur GraphicInfo ist wie folgt definiert: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
STRUCT GraphicInfo sizeX as WORD sizeY as WORD bitsPerPixel as WORD numImages as WORD End STRUCT | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Hinweis: Die von der Instancevariablen imgInfo gelieferten Daten können sich von denen, die von der Routine GetImageInfo geliefert werden (siehe Programmierhandbuch, Kapitel 2.8.6.3 Externe Bilddateien), unterscheiden. Das kann mehrere Gründe haben:
ImgStateDie Instancevariable imgState enthält die Information, welche Art von Bild das Objekt gerade darstellt. Der Wert kann nur gelesen werden.Syntax Lesen: <numVar> = <obj>.imgState ImgState liefert einen der folgenden Werte zurück:
RedrawDie Methode Redraw bewirkt, dass sich das Objekt neu auf dem Bildschirm darstellt. Der Aufruf der Methode ist nur selten notwendig. Ein Beispiel wäre, wenn Sie in einem Maushandler etwas auf den Screen gezeichnet haben und das einfach wieder löschen wollen.
Syntax: <obj>.Redraw [drawBackground]
drawBackground: TRUE | FALSE (Default: FALSE)
Beispiel: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoImage.Redraw DemoImage.Redraw TRUE | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DrawBackground = TRUE bewirkt, dass das Objekt seinen Hintergrund ebenfalls neu zeichnet. Das kann erforderlich sein, wenn die Grafik transparente Anteile enthält oder Sie die Instancevariablen drawPos, borderColor und / oder bgColor verwendet haben.
^4.17.3 Spezielle AttributeNeben dem "einfachen" Darstellen von Bildern und Animationen können Sie die Eigenschaften des Imageobjekts in gewissen Grenzen einstellen. Insbesondere können Sie festlegen, dass die Grafik vergrößert oder verkleinert dargestellt wird (Instancevariable scale), an eine andere Position als die linke obere Ecke gezeichnet wird (Instancevariable drawPos), Sie können einen Rahmen um die Grafik zeichnen (Instancevariable borderColor) und einen farbigen Hintergrund festlegen (Instancevariable bgColor). Außerdem können Sie festlegen, dass das Objekt seine Größe an die Größe der dargestellten Grafik anpassen soll (Instancevariable autoSize).ScaleScale enthält einen Faktor, um den die Grafik bei der Darstellung gestreckt oder gestaucht wird. In den meisten Fällen brauchen Sie keinen Skalierungsfaktor zu setzen, weil der Defaultwert in x- und in y-Richtung 1 ist.
Syntax UI-Code: scale = scaleX, scaleY
Schreiben: <obj>.scale = scaleX, scaleY
Lesen: <numVar> = <obj>.scale(n)
n= 0: x-Skalierungsfaktor lesen
n= 1: y-Skalierungsfaktor lesen
scaleX: Skalierungsfaktor in x-Richtung
scaleY: Skalierungsfaktor in y-Richtung
Beispiel: Grafik in doppelter Größe darstellen: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imageFile = SP_DOCUMENT, "IMAGES\\SUNSET.JPG" scale = 2, 2 End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DrawPosDie Instancevariable drawPos enthält die Koordinaten, auf die die linke obere Ecke der Grafik gezeichnet werden soll. Der Defaultwert ist (0; 0). Negative Koordinaten sind zulässig.
Syntax UI-Code: drawPos = x0, y0
Schreiben: <obj>.drawPos = x0, y0
Lesen: <numVar> = <obj>.drawPos(n)
n= 0: x-Position lesen
n= 1: y-Position lesen
x0, y0 Koordinaten
borderColorDie Instancevariable borderColor enthält Farbwerte um einen dünnen Rahmen um das Objekt zu zeichnen. Die Defaultwerte sind jeweils -1, das heißt per Default wird kein Rahmen gezeichnet.Der Rahmen wird immer um das ganze Objekt gezeichnet, auch wenn die Grafik kleiner als Objekt ist und/oder nicht auf die Position (0; 0) gezeichnet wird.
Syntax UI-Code: borderColor = ltCol, rbCol
Schreiben: <obj>.borderColor = ltCol, rbCol
Lesen: <numVar> = <obj>.borderColor(n)
n= 0: ltCol lesen
n= 1: brCol lesen
ltCol: Farbwert für die Linien links und oben (left, top)
-1: Links und oben keinen Rahmen zeichnen (Default)
rbCol: Farbwert für die Linien rechts und unten (right, bottom)
-1: Rechts und unten keinen Rahmen zeichnen (Default)
Für ltCol und rbCol sind nur Indexfarben zulässig.
bgColorMit der Instancevariablen bgColor kann man eine Hintergrundfarbe für die Grafik festlegen. Das kann sinnvoll sein, wenn die Grafik transparente Anteile enthält. Der Defaultwert für den Parameter col ist -1, das heißt es wird die vom System vorgegeben Hintergrundfarbe ohne Füllmuster verwendet.
Syntax UI-Code: bgColor = col, pattern
Schreiben: <obj>.bgColor = col, pattern
Lesen: <numVar> = <obj>.bgColor(n)
n= 0: Farbe col lesen
n= 1: Füllmuster pattern lesen
col: Farbwert für den Hintergrund (nur Indexfarben erlaubt)
-1: Systemhintergrund verwenden (Default)
pattern: Füllmuster (erlaubte Werte: siehe Tabelle unten)
BgColor ist für alle GenericClass Objekte definiert und erwartet einen Farbwert für das unselektierte und einen für das selektiert Objekt. Da dies bei Image-Objekten nicht sinnvoll ist wird der zweite Parameter als Füllmuster-Wert interpretiert. Wenn Sie kein Muster, sondern eine vollständig gefüllte Fläche wünschen, müssen Sie die Konstante DM_100 (Wert: 25) als zweiten Parameter verwenden. Füllmuster werden im Programmierhandbuch, Kapitel 2.8.4 (Die Systemvariable "graphic": Mixmodes und mehr) beschrieben. Im Anhang C finden Sie verschiedene Beispiele für die von GEOS bereitgestellten Füllmuster. Tabelle: Erlaubte Werte für Füllmuster
Die folgenden Bilder setzen folgende Objektdeklaration voraus: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Image DemoImage imageFile = 0, "D:\\Bilder\\TEST3.RLE" fixedSize = 80, 80 End OBJECT | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Von links nach rechts wurden folgende Zeilen hinzugefügt:
Von links nach rechts wurden folgende Zeilen hinzugefügt:
autoSizeDie Instancevariable autoSize bestimmt, ob das Objekt seine Größe an die dargestellte Grafik anpassen soll. Der Defaultwert ist FALSE (Größe nicht automatisch berechnen).Hat autoSize den Wert TRUE so berechnet das Objekt seine Größe automatisch neu, wenn das Programm startet oder wenn es eine neue Grafik darstellen soll. Intern setzt das Objekt den Hint "fixedSize" um seine Größe festzulegen. Dabei kommen folgende Formeln zur Anwendung:
Breite = breite_der_grafik + 2 * drawPos_x
Höhe = höhe_der_grafik + 2 * drawPos_y
Durch dieses Vorgehen wird ein "Rahmen" um die eigentliche Grafik erzeugt, wenn Sie die Instancevariable "drawPos" verwenden.
Syntax UI-Code: autoSize = TRUE
Der Defaultwert ist FALSE.
Schreiben: <obj>.autoSize = TRUE | FALSE
Lesen: <numVar> = <obj>.autoSize
Sie können die Größe des Imageobjekts bei der automatischen Berechnung begrenzen, indem Sie die Hints "minimumSize" und "maximumSize" verwenden. Der Berechnungsalgorithmus prüft, ob einer oder beide dieser Hints gesetzt sind und schränkt die Werte für Breite und Höhe des Objekts so ein, dass die minimalen und maximalen Werte nicht überschritten werden. Diese Werte werden dann an den Hint "fixedSize" übergeben. Wichtige Hinweise:
^4.17.4 AnimationenDas Image-Objekt kann Animationen automatisch ohne weiteres Zutun des Programmierers abspielen. Die Berechnung und Darstellung der Bilder erfolgt dabei im Hintergrund, so dass Ihr BASIC Programm ganz normal weiterarbeiten kann.Um eine Animation mit einem Image-Objekt darzustellen müssen Sie dem Objekt nur eine Datei zuweisen, die eine Animation enthält (Instancevariable ImageFile).
Mit den Methoden AnimationStart, AnimationStop und AnimationNext haben Sie volle Kontrolle über das Abspielen der Animation. Mit der Instancevariablen autoStart können Sie festlegen, dass die Animation automatisch startet. Informationen über den aktuellen Status der Animation bekommen Sie mit den Instancevariablen currentFrame, numFrames, animationTics (kann auch gesetzt werden um die Geschwindigkeit zu ändern) sowie den weiter oben beschriebenen Instancevariablen imgInfo und imgState.
AnimationStartDie Methode AnimationStart startet eine Animation. Sie können AnimationStart auch zum Fortsetzen einer mit AnimationStop angehaltenen Animation verwenden. Wenn Sie im UI Code die Instancevariable autoStart auf TRUE gesetzt haben startet die Animation beim Laden des Programms automatisch, ohne den Aufruf von AnimationStart.Syntax: <obj>.AnimationStart AnimationStopDie Methode AnimationStop hält eine laufende Animation an. Falls Sie eine Animation in einer Dialogbox haben sollten Sie nach dem Schließen der Dialogbox AnimationStop rufen, damit die Animation nicht unnötig im Hintergrund weiterläuft.Syntax: <obj>.AnimationStop AnimationNextDie Methode AnimationNext wählt das nächste Bild einer angehaltenen Animation an. AnimationNext ist wirkungslos bei einer laufenden Animation.Syntax: <obj>.AnimationNext Beispiel. Die im Objekt DemoImage laufende Animation wird für 3 Sekunden gestoppt, dann wird das nächste Bild angezeigt und nach weiteren 3 Sekunden wir die Animation mit normaler Geschwindigkeit fortgesetzt. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoImage.AnimationStop Pause 30 DemoImage.AnimationNext Pause 30 DemoImage.AnimationStart | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
autoStartDie Instancevariable autoStart bestimmt, ob ein vom Imageobjekt angezeigte Animation beim Starten des Programms oder bei der Zuweisung einer neuen Datei automatisch abgespielt werden soll oder nicht. Der Defaultwert ist FALSE (Animation nicht automatisch starten). Beachten Sie, dass eine gestartete Animation "im Hintergrund" weiterläuft auch wenn das Imageobjekt gerade nicht sichtbar ist. Setzen Sie "autoStart" nur dann auf TRUE, wenn es wirklich notwendig ist.Wenn Sie "autoStart" zu Laufzeit auf TRUE setzen wird die Animation sofort gestartet.
Syntax UI-Code: autoStart = TRUE
Der Defaultwert ist FALSE.
Schreiben: <obj>.autoStart = TRUE | FALSE
Lesen: <numVar> = <obj>.autoStart
currentFrameDie Instancevariable currentFrame enthält die Nummer des aktuell angezeigten Bildes der Animation. Die Zählung beginnt bei Null. Der Wert kann jederzeit gelesen werden. Ein Setzen zur Laufzeit ist nur möglich, wenn die Animation gerade nicht läuft. Im UI-Code kann der Wert nicht gesetzt werden.
Syntax UI-Code: --
Schreiben: <obj>.currentFrame = wert
Lesen: <numVar> = <obj>.currentFrame
Hinweis: Das Aufrufen eines speziellen Frames kann manchmal etwas dauern, weil das Aussehen eines Bildes vom Aussehen der vorhergehenden Bilder abhängen kann. Deshalb muss das Image Objekt möglicherweise einen großen Teil der Animation erneut dekodieren um den gewünschten Frame anzuzeigen. numFramesDie Instancevariable numFrames enthält die Anzahl der Bilder in einer Animation. Im Fehlerfall enthält numFrames den Wert Null. Außerdem können Sie im Fehlerfall die globale Variable fileError abfragen, um das Problem einzugrenzen. Verwenden Sie die Routine ErrorText$() um den Fehlercode in fileError in einen verständlichen Text zu übersetzen.
Syntax UI-Code: --
Schreiben: --
Lesen: <numVar> = <obj>.numFrames
animationTicsDie Instancevariable animationTics enthält die Zeit zwischen zwei benachbarten Frames einer Animation, gemessen in tics (1 tic = 1/60 s). Je kleiner der Wert ist, desto schneller läuft die Animation. Der Wert kann zur Laufzeit gelesen und geschrieben, aber nicht im UI Code gesetzt werden.Wird der Wert bei laufender Animation gesetzt so ändert das Imageobjekt die Abspielgeschwindigkeit sofort.
Syntax UI-Code: --
Schreiben: <obj>.animationTics = <Wert>
Lesen: <numVar> = <obj>.animationTics
^ |