4.9 View und Content4.9.1 Überblick4.9.2.1 Das Content eines View 4.9.1 ÜberblickDie View Objektklasse stellt ein "Fenster" bereit, in dem beliebige grafische Daten - einschließlich Texte - dargestellt werden können. Die Inhalte dieses Fensters, d.h. die grafischen Daten, werden vom "Content"-Objekt (content: engl. Inhalt) bereitgestellt.
Häufig ist es so, dass der Nutzer im "Ansicht"-Menü festlegen kann, ob das Dokument in Originalgröße, vergrößert oder verkleinert dargestellt werden soll. Für diesen Zweck gibt es das "ViewControl" Objekt, das zum einen die erforderliche UI bereitstellt und zum anderen automatisch im Hintergrund mit dem View-Objekt zusammenarbeitet. Die Aufgabe des Programmierers ist es lediglich die Objekte zu deklarieren und mit wenigen Anweisungen zu konfigurieren. Die Kombination der View/Content ist sehr universell und für praktisch alle Anwendungsgebiete geeignet. Das Ausnutzen dieser Möglichkeiten erfordert daher eine gewisse Einarbeitung in die Eigenschaften der beiden Objektklassen und ihrem Zusammenspiel, wobei man um gelegentliches Experimentieren nicht herumkommt. Die Verwendung der Klasse BitmapContent stellt bereits einen Spezialfall dar, der in der Grundkonfiguration sehr einfach zu handhaben ist.
Es gibt in R-BASIC weitere, spezialisierte und damit noch einfacher zu handhabende Möglichkeiten, Grafiken darzustellen. Einen Überblick über diese Möglichkeiten, die ohne die Verwendung eines View-Objekts auskommen, und Verweise zu den entsprechenden Abschnitten in diesem Handbuch finden Sie im Kapitel 2.2.
MausunterstützungDas Viewobjekt leitet die Mausereignisse direkt an sein Content-Objekt weiter. Bei Bedarf können Sie Maushandler für das Content-Objekt bzw. seine Children schreiben.TastaturhandlingIm Normalfall behandelt das View-Objekt die Tastaturereignisse selbständig, indem es sie an sein Content-Objekt weiterreicht. Sie können sich aber in das Tastaturhandling eines View-Objekts einklinken, indem Sie einen Tastaturhandler schreiben. Zum Beispiel könnten Sie die Tastenkombination Strg-'+' benutzen, um den Zoomfaktor des Views zu vergrößern. Eine ausführliche Beschreibung, wie man einen Tastaturhandler schreibt und was es dabei zu beachten gilt, finden Sie im Handbuch "Spezielle Themen", Kapitel 14. Es ist sehr selten, dass man einen Tastaturhandler für ein Viewobjekt benötigt. In den meisten Fällen wird die Tastatur vom Content bzw. seinen Children behandelt.Wichtig: Das View-Objekt gibt die Tastaturereignisse zuerst an sein Content weiter, bevor es den BASIC Tastaturhandler aufruft. Sollten beide Objekte (View und Content) einen Tastaturhandler haben wird daher zuerst der Tastaturhandler des Content-Objekts aufgerufen und erst danach der Tastaturhandler des View-Objekts. Im Kapitel 14.4 des Handbuchs "Spezielle Themen" ist am Beispiel eines Textobjekts beschrieben, wie man vorgehen muss, um den BASIC-Tastaturhandler aufzurufen, bevor das Objekt das Tastaturereignis an sein Content weitergibt.
Focus und TargetDas View-Objekt ist ein Knoten in der Focus- und Target-Hierarchie. Es ist möglich zu überwachen, ob ein View-Objekt den Focus oder das Target hat, indem man einen Focus- bzw. Target-Handler schreibt. Die notwendigen Details zur Arbeit mit Focus und Target finden Sie im Kapitel 12 (Focus und Target) des Handbuchs "Spezielle Themen". Das Arbeiten mit Focus und Target ist etwas für erfahrene Programmierer und im Zusammenhang mit einer View/Content Kombination nur in wenigen Fällen notwendig.^4.9.2 Das ViewDas View-Objekt ist die Schnittstelle zwischen ihrer Programm-UI und den darzustellenden Inhalten. Es arbeitet in vielen Situationen automatisch mit seinem Content-Objekt zusammen und sorgt bei Bedarf für das Scrolling, Clipping und den Zoom.Häufig entsprechen die darzustellenden Daten (Text, Grafik ...) einem Dokument. In GeoDraw sind dies Grafiken, in GeoWrite Texte und in R-BASIC der Quellcode eines Programms. Der Einfachheit halber sprechen wir im Folgenden auch dann von "Dokument" wenn das Programm keine Dokument-Dateien hat. In diesem Sinne ist in einem Spiel das Spielfeld das darzustellende "Dokument". Im Kern ist es so, dass das View einen bestimmten Ausschnitt aus dem Dokument darstellt. Welcher Bereich das ist und ob er vergrößert, verkleinert oder in Originalgröße dargestellt wird, das bestimmt entweder der Nutzer über das Ansicht-Menü, (das ein ViewControl-Objekt enthält) bzw. über die Rollbalken des View-Objekts oder der Programmierer legt dies über Programmbefehle fest. Die Position, die in der linken oberen Ecke des View dargestellt wird heißt "origin" (engl.: Ursprung).
Abstammung:
Spezielle Instance-Variablen:
Methoden:
^4.9.2.1 Das Content eines ViewJedes View benötigt genau ein Content-Objekt, dass die Daten des Dokuments darstellt. Wie bereits oben erwähnt verwenden wir den Begriff Dokument auch dann, wenn die darzustellenden Daten zu keiner Dokument-Datei im engeren Sine gehören. Die Instancevariable Content enthält das aktuelle Content-Objekt. Häufig ist das gleichzeitig der Screen zur Ausgabe von Grafik und Text. Das muss jedoch nicht sein. Die Instancevariable contentSize enthält die Größe des Content-Objekts, also die Größe des vom View darzustellenden Dokuments. Mit der Methode Redraw können Sie ein Neuzeichnen des Views und seines Content auslösen.ContentDie Instance-Variable Content (engl.: Inhalt) enthält das aktuelle Content-Objekt des View's. Es kann im BASIC-Code gelesen und geschrieben werden. Wird dem View ein neues Content-Objekt zugeordnet stellt sich das View automatisch neu dar, so dass der neue Content sichtbar wird. Dabei kommuniziert das View mit dem neuen Content und kann, je nachdem, welche Werte für hControl, vControl und viewAttrs gesetzt sind, gegebenenfalls seine Größe neu bestimmen.Ein eventuell vorher mit dem View verbundenes Content-Objekt wird dabei automatisch abgekoppelt. Die Zuweisung eines "leeren" Content-Objekts mit der Funktion NullObj() ist zulässig.
Syntax UI-Code: Content = <obj>
<obj> muss namentlich aufgeführt werden.
Variablen sind im UI-Code nicht zulässig.
Lesen: <objVar> = <obj>.Content
Schreiben: <obj>.Content = <obj2>
Beachten Sie, dass die Zuweisung eines neuen Content-Objekts den aktuelle "Screen" nicht beeinflusst (siehe auch Kapitel 2.3.1). Wenn das alte Content-Objekt der "Screen" war, bleibt er es auch. Alle Grafik- und Text-Ausgaben gehen weiterhin an dieses Objekt. Möglicherweise müssen Sie also zusätzlich das neue Content-Objekt auch der Screen-Variablen zuweisen. Beispiel UI-Code: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View MyView hControl = HVC_SCROLLABLE vControl = HVC_SCROLLABLE Content = MyBitmapContent END Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Beispiele BASIC-Code: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DIM ob as OBJECT ob = MyView.Content ' Altes Content merken MyView.Content = MyOtherContent ' Neues Content-Objekt zuweisen ... MyView.Content = ob ' Altes Content wieder zuweisen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
contentSizeDie Instance-Variable contentSize speichert die x- und y-Ausdehnung der vom Content-Objekt darzustellenden Dokuments. Gemeinsam mit seiner eigenen Größe und einem eventuell eingestellten Zoom-Faktor kann das View dann z.B. entscheiden, ob es Scrollbalken verwenden muss und wie groß deren "innerer Balken" zu sein hat.In vielen Fällen verwaltet das View die contentSize automatisch, indem es mit dem Content-Objekt kommuniziert. Bei Bedarf kann contentSize aber sowohl im UI-Code als auch im BASIC-Code geschrieben werden.
Syntax UI-Code: contentSize = xSize, ySize
Lesen: <numVar> = <obj>.contentSize (0) ! x-Size
<numVar> = <obj>.contentSize (1) ! y-Size
Schreiben: <obj>.contentSize = xSize, ySize
Beispiel UI-Code: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View MyView < .. andere Instance-Variablen hier .. > contentSize = 100, 200 END Objekt | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Beispiele BASIC-Code: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DIM breite AS Real ' Ausgabe in der Dokument-Größe in der Form: Breite x Höhe" breite = MyView.contentSize(0) Print "Alte Größe = "; breite ; " x "; MyView.contentSize(1); "Pixel" MyView.contentSize = 64, 48 ' Neue Größe zuweisen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RedrawDie Methode Redraw löst ein Neuzeichnen des kompletten View-Objekts und seines Content aus.Syntax im Basic-Code: <viewObj>.Redraw Hinweis: Die Redraw-Methode anderer Objekte akzeptiert einen Parameter. Für View-Objekte ist der Parameter syntaktisch möglich, wird jedoch ignoriert. ^4.9.2.2 View GeometrieDa ein View ein generisches Objekt ist können alle Geometrie-Hints aus dem Kapitel 3.3, insbesondere aus dem Kapitel 3.3.4 (Objektgröße) mit einem View verwendet werden. Die wichtigsten sind der Einfachheit halber hier noch einmal aufgeführt. Beachten Sie, dass die ~Size-Hints mit den Werten für hControl bzw. vControl in Konflikt geraten können.
Zusätzlich verfügt das View über eigene Geometriefähigkeiten, die mit der Größe des darzustellenden Dokuments und der Bereitstellung von Rollbalken (Scroller) zusammenhängen. Die Instancevariablen hControl und vControl legen fest, wie sich das View in horizontaler (hControl) oder vertikaler (vControl) Richtung darstellt. Mit dem Hint HideScrollersWhenNotScrollable kann man bewirken, dass Rollbalken nur dann dargestellt werden, wenn sie wirklich gebraucht werden. Schließlich kann man mit viewColor die Hintergrundfarbe des View einstellen.
hControl, vControlDie Instancevariablen hControl und vControl legen fest, wie sich das View in horizontaler (hControl) oder vertikaler (vControl) Richtung darstellt. Zulässige Werte sind Kombinationen der HVC_-Konstanten (HVC: horizontal-vertical-control). Die Werte sind so gewählt, dass jede Konstante genau ein Bit gesetzt hat (Bitflags). Mehrere Konstanten können mit + oder OR verknüpft werden, die Abfrage, ob ein bestimmter Wert gesetzt ist kann mit der logischen AND Funktion erfolgen.
Syntax UI-Code: hControl = numWert
vControl = numWert
numWert ist eine Kombination der HVC_-Konstanten
Lesen: <numVar> = <obj>.hControl
<numVar> = <obj>.vControl
Schreiben: <obj>.hControl = numWert
<obj>.vControl = numWert
numWert ist eine Kombination der HVC_-Konstanten
Folgende Konstanten stehen zur Verfügung. Hier nicht aufgeführte Werte (z.B. 2) sollten auch nicht verwendet werden, da ihre Wirkung unbestimmt ist. Auch die Kombination widersprüchlicher Werte (z.B. HVC_SCROLLABLE + HVC_NO_SCROLLBAR) kann seltsame Folgen haben.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View MyView
hControl = HVC_NO_LARGER_THAN_CONTENT +
HVC_NO_SMALLER_THAN_CONTENT
vControl = HVC_SCROLLABLE
Content = MyBitmapContent
END Object
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Beispiel: Abfrage mit AND, ob das View scrollbar ist | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IF MyView.vControl AND HVC_SCROLLABLE THEN ... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HideScrollersWhenNotScrollableBewirkt, dass der Rollbalken verschwindet, wenn das View in die zugehörige Richtung nicht scrollen kann, weil bereits das gesamte Dokument angezeigt wird.
Syntax UI-Code: HideScrollersWhenNotScrollable
Lesen: --
Schreiben: --
viewColorDie Instancevariable viewColor bestimmt die Hintergrundfarbe für das View. Per Default ist sie weiß.
Syntax UI-Code: viewColor = color
Lesen: <numVar> = <obj>.viewColor
Schreiben: <obj>.viewColor = color
color: numerischer Farbwert. Index- oder RGB-Farbe
^4.9.2.3 Die View AttributeDie Instancevariable viewAttrs enthält wichtige Konfigurationsdaten für das View aus verschiedenen Bereichen.viewAttrsViewAttrs sind Bitflags, d.h. jedes Bit steht für eine bestimmte Eigenschaft, die einzeln zu- oder abgeschaltet werden kann. Bits, die in der untenstehenden Tabelle nicht aufgeführt sind, sind immer Null. Per Default ist kein Bit aus der Tabelle gesetzt.
Syntax UI-Code: viewAttrs = bitsToSet, bitsToClear
Lesen: <numVar> = <obj>.viewAttrs (0)
Die BASIC-Syntax erfordert beim Lesen von viewAttrs
einen Parameter. Der Wert wird hier ignoriert.
Schreiben: <obj>.viewAttrs = bitsToSet, bitsToClear
bitsToSet: zu setzende Attribute, Bitflags, siehe Tabelle
bitsToClear: zu setzende Attribute, Bitflags, siehe Tabelle
Verfügbare Attribute für viewAttrs:
Bedeutung / Wirkung der einzelnen Attribute:
^4.9.2.4 Scaling und ScrollingIn den meisten Fällen stellt der Nutzer den gewünschten Skalierungsfaktor über das Ansicht-Menü ein, dass ein ViewControl-Objekt enthält. Die gewünschte Position im Dokument wählt der Nutzer über die Rollbalken des View. Es ist jedoch auch möglich die Skalierung und Position per Programmcode einzustellen.Mit der Instancevariablen scale kann man den Skalierungsfaktor ändern. ScaleToFitOptions beeinflusst das Verhalten des View, wenn es sich im Modus "Größe anpassen" befindet. Manuell kann man diesen Modus einstellen, wenn man das Bit VA_SCALE_TO_FIT in der Instancevariablen viewAttrs setzt. Die Instancevariable origin (engl. für Ursprung) enthält die Dokumentkoordinaten, die links oben im View dargestellt werden sollen. Mit der Methode GetVisibleRect erhält man die Koordinaten des gesamten, vom View dargestellten Bereichs. Je nach Skalierungsfaktor können das mehr oder weniger Pixel sein, als das View selbst groß ist. Die Methoden ScrollToOffset und ScrollCmd erlauben es dem Programmierer, das View in eine bestimmte Richtung um einen bestimmten Betrag zu scrollen. Die Instancevariable viewIncrement enthält die Werte um die das View bei Scrolloperationen scrollen soll. Mit SuspendUpdate kann man verhindern, dass aufeinander folgende Zoom- und Scrolloperationen ein wiederholtes Neuzeichnen des View bewirken. Schließlich kann man mit DoNotWinScroll verhindern, dass das View überhaupt auf Scroll-Kommandos reagiert.
scaleDie Instancevariable scale enthält den aktuellen Skalierungsfaktor (Zoomfaktor) des View-Objekts, getrennt für x- und y-Richtung.Hinweis: Views, die mit einem ViewControl zusammenarbeiten (in viewAttrs ist das Bit VA_CONTROLLED gesetzt) unterstützen keine unterschiedlichen Skalierungsfaktoren in x- und in y-Richtung.
Syntax UI-Code: scale = xScale, yScale
Lesen: <numVar> = <obj>.scale(0) ' xScale lesen
<numVar> = <obj>.scale(1) ' yScale lesen
Schreiben: <obj>.scale = xScale, yScale
xScale: Skalierungsfaktor in x-Richtung
yScale: Skalierungsfaktor in y-Richtung
scaleToFitOptionsWenn der Nutzer im Ansicht-Menü den Eintrag "Größe anpassen" auswählt stellt das View den Zoomfaktor so ein, dass das gesamte Dokument sichtbar wird. Mit der Instancevariablen scaleToFitOptions können Sie dieses Verhalten modifizieren. In der Tabelle unten finden Sie die Möglichkeiten. ScaleToFitOptions sind Bitflags, d.h. Sie können mehrere Werte kombinieren.
Syntax UI-Code: scaleToFitOptions = options [ , xSize, ySize ]
Lesen: <numVar> = <obj>.scaleToFitOptions (0)
Die BASIC-Syntax erfordert beim Lesen von
scaleToFitOptions einen Parameter.
Der Wert wird hier ignoriert.
Schreiben: <obj>.scaleToFitOptions = options [ , xSize, ySize ]
options: numerischer Wert, Bitflags, siehe Tabelle
xSize, ySize: Parameter für SFO_PAGE_SIZE
Mögliche Werte für scaleToFitOptions
Tipp: Um bereits am Programmstart ein "angepasstes" Dokument zu erhalten setzen Sie im UI-Code das Bit VA_SCALE_TO_FIT in der Instancevariablen viewAttrs. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View DemoView
viewAttrs = VA_SCALE_TO_FIT, 0
scaleToFitOptions = SFO_BOTH_DIMENSIONS
' Bewirkt, dass sich der Skalierungsfaktor in beide
' Richtungen automatisch der Größe des View anpasst.
...
END Object
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Alternativ können Sie das Bit auch zur Laufzeit setzen. Das Aufrufen der Redraw-Methode ist nur nötig, wenn das Bit VA_CONTROLLED nicht gesetzt ist. Sie zwingt das View, sich neu darzustellen. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DemoView.viewAttrs = VA_SCALE_TO_FIT, 0
'Falls nötig: DemoView.Redraw
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
originOrigin enthält die Dokument-Koordinaten, die in der linken oberen Ecke des View dargestellt werden. Wenn Sie im BASIC Code den Wert verändern scrollt das View automatisch dorthin. Origin kann nicht im UI-Code verwendet werden.
Syntax Lesen: <numVar> = <obj>.origin (0) ' xOrigin lesen
<numVar> = <obj>.origin (1) ' yOrigin lesen
Schreiben: <obj>.origin = xOrigin , yOrigin
xOrigin, yOrigin: Position, in Dokumentkoordinaten
GetVisibleRectDie Methode GetVisibleRect liefert die Koordinaten des Bereichs des Dokuments, der im View zu sehen ist. Sie liefert eine Struktur vom Typ RectDWord, die folgendermaßen definiert ist: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Struct RectDWord x0, y0, x1, y1 as LongInt End Struct | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
X0 und y0 bezeichnen dabei die linke obere Ecke des sichtbaren Bereichs. Das entspricht der Instancevariablen origin. X1 und y1 bezeichnen die rechte untere Ecke des sichtbaren Bereichs.
Syntax im Basic-Code: <rect> = <viewObj>.GetVisibleRect
rect: Variable vom Typ RectDWord
ScrollToOffsetDie Methode ScrollToOffset scrollt das View um einen bestimmten Betrag in x- und/oder in y-Richtung.Um direkt zu einem bestimmten Bereich des Dokuments zu scrollen setzen Sie bitte die Instancevariable origin oder verwenden Sie die Methode ScrollCmd.
Syntax im Basic-Code: <viewObj>.ScrollToOffset (xOffs, yOffs)
xOffs, yOffs: Verschiebung, in Dokumentkoordinaten
Null und negative Werte sind zulässig.
ScrollCmdDie Methode ScrollCmd scrollt das View in eine bestimmte Richtung bzw. an eine bestimmte Position.Alternativ können Sie die Instancevariable origin setzen oder die Methode ScrollToOffset verwenden.
Syntax im Basic-Code: <viewObj>.ScrollCmd (cmd [ , param ]
cmd: Auszuführende Operation, siehe Tabelle
param: Zusätzlicher Parameter für Kommandos
SC_SET_Y_ORIGIN und SC_SET_X_ORIGIN
Erlaubte Kommandos für ScrollCmd. Eine "Seite" entspricht dabei immer der aktuellen Höhe bzw. Breite des im View sichtbaren Bereichs.
viewIncrementDie Instancevariable viewIncrement enthält - getrennt für x- und y-Richtung - den Wert um den das View scrollen soll, wenn der Nutzer z.B. die Pfeile an den Rollbalken anklickt. ViewIncrement wird ebenso für einige Funktionen der Methode ScrollCmd (siehe oben) und für das Drag-Scrolling verwendet.
Syntax UI-Code: viewIncrement = xInc , yInc
Lesen: <numVar> = <obj>.viewIncrement (0) ' xInc lesen
<numVar> = <obj>.viewIncrement (1) ' yInc lesen
Schreiben: <obj>.viewIncrement = xInc , yInc
xInc, yInc: neue Increment-Werte, in Dokumentkoordinaten
Defaultwerte: xInc = 20, yInc = 15
SuspendUpdateSuspendUpdate = TRUE bewirkt, dass Scrolling und Scaling Operationen zunächst nicht angezeigt werden. Das ist sinnvoll, wenn mehrere dieser Operationen nacheinander durchgeführt werden müssen und ein ständiger Neuaufbau des Bildschirms vermieden werden soll.Ein abschließendes SuspendUpdate = FALSE stellt das View und das Dokument dann in seinem neuen Zustand dar.
Syntax im Basic-Code: <viewObj>.suspendUpdate = TRUE
<viewObj>.suspendUpdate = FALSE
DoNotWinScrollVerhindert, dass das View scrollt. Die Rollbalken werden trotzdem upgedatet. Sehr selten verwendet.
Syntax UI-Code: DoNotWinScroll
Lesen: --
Schreiben: --
^4.9.2.5 Drag ScrollingStellen Sie sich vor, Sie klicken mit der linken Maustaste in das View und "ziehen" die Maus mit gedrückter Taste aus dem View. In vielen Fällen ist es erwünscht, dass das View dann zum dem Bereich scrollt, über dem sich die Maus jetzt befinden würde. Dieses Verhalten nennt man "Drag-Scrolling". Um es zu aktivieren müssen Sie nur das Bit VA_DRAG_SCROLLING in der Instancevariablen viewAttrs setzen. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View DemoView defaultTarget viewAttrs = VA_CONTROLLED + VA_DRAG_SCROLLING, 0 ... End Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Per Default aktiviert das View den Drag-Scroll Modus nur beim Drücken der linken Maustaste. Mit der Methode InitiateDragScroll können Sie diesen Modus auch für andere Fälle, z.B. beim Drücken der rechten Maustaste, aktivieren. Schließlich können Sie mit SetDragBounds den Bereich, in dem das Dragging stattfinden soll, einschränken.
Die Hints ImmediateDragUpdates und ImmediateDragUpdates kontrollieren, wie oft das View während des Dragging das Dokument neu zeichnet. Mit der Instancevariablen viewIncrement können Sie kontrollieren um welchen Betrag das Dokument bei jedem Neuzeichnen gescrollt wird.
InitiateDragScrollPer Default wird das Drag-Scrolling vom View beim Drücken der linken Maustaste aktiviert. InitiateDragScroll aktiviert das Drag-Scrolling in anderen Situationen, z.B. beim Drücken der rechten Maustaste.Syntax im Basic-Code: <viewObj>.InitiateDragScroll Beachten Sie, dass das View selbst keinen Maushandler haben kann. Bei Bedarf müssen Sie einen Maushandler für das Content-Objekt des Views schreiben. SetDragBoundsDie Methode SetDragBounds schränkt den Bereich für das Drag-Scrolling ein. Das View scrollt dann während des Draggings nicht über den angegeben Bereich hinaus.
Syntax im Basic-Code: <viewObj>.SetDragBounds x0, y0, x1, y1
x0, y0, x1, y1: Koordinaten des Rechtecks,
in dem das View scrollen soll.
Achtung! Das View merkt sich die DragBounds. Wenn Sie einschränkende DragBounds gesetzt haben, müssen Sie sie auch wieder zurücknehmen. Beispiel: Sowohl die linke als auch die rechte Maustaste sollen Dragging unterstützen. Beim Drücken der linken Maustaste sollen DragBounds gesetzt werden. Eine vollständige Version des Codes finden Sie bei den Beispielen unter "Objekte\View-Content\Dragging Demo" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View DemoView defaultTarget viewAttrs = VA_CONTROLLED + VA_DRAG_SCROLLING Content = DemoBitmap ... END Object BitmapContent DemoBitmap bitmapFormat = 960, 720, 8 DefaultScreen OnMouseButton = MouseButtonHandler END Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MOUSEACTION MouseButtonHandler
Case ME_LEFT_DONW
' Das DragScroling startet automatisch. Nur DragBounds setzen
DemoView.SetDragBounds 50, 100, 480, 320
End Case
Case ME_LEFT_UP
' Nicht vergessen: DragBounds auf Maximum!
DemoView.SetDragBounds 0, 0, 960, 720
End Case
Case ME_RIGHT_DOWN
' Das DragScroling manuell starten
DemoView.InitiateDragScroll
End Case
End Switch
END ACTION ' MouseButtonHandler
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ImmediateDragUpdates, DelayedDragUpdatesDiese beiden Hints beeinflussen die Häufigkeit, mit der das Dokument während des Drag-Scrolling neu gezeichnet wird. Die Hints können nur im UI-Code gesetzt werden.
Syntax UI-Code: ImmediateDragUpdates
DelayedDragUpdates
^4.9.2.6 Ändern des MauszeigersHäufig ist es erwünscht, dass sich die Form des Mauszeigers ändert, wenn sich die Maus über dem View befindet. Für ein Ballerspiel ist z.B. ein Fadenkreuz angemessen. Mit der Methode SetPointerImage können Sie einen neuen Mauszeiger festlegen. Die Methode ClearPointerImage stellt den vorherigen Mauszeiger wieder ein.So definiert man einen MauszeigerMauszeiger sind immer 16x16 Pixel groß. Jedes Pixel kann 4 Werte annehmen. Die folgende Tabelle zeigt die Zusammenhänge.
Mauspointer werden unter R-BASIC in DATA-Zeilen definiert. Dabei sind die ersten beiden Werte der "Hotspot", also das Pixel, das die eigentliche Position des Mauszeigers darstellt. Darauf folgen 32 Word-DATA-Werte, die den Mauszeiger beschreiben. Der einfachste und empfehlenswerte Weg zum Erzeugen der DATA-Zeilen ist, das Programm "Mouse Pointer Creator", dass auf der R-BASIC Webseite verfügbar ist.
Hintergrundinformation: So sind die DATA-Werte aufgebautUm die DATA-Werte zu erhalten werden jeweils 8 Pixel zu einem Word-Wert entsprechend dem folgenden Schema zusammengefasst. Die Farben dienen nur dem besseren Verständnis der Zuordnung.
Damit ergibt sich folgende Berechnungsvorschrift:
DATA-Wert = 16384 * Bit7 + 4096 * Bit6 + 1024 * Bit5
+ 256 * Bit4 + 64 * Bit3 + 16 * Bit2
+ 4 * Bit1 + 1 * Bit0
Beispiel: Wir wollen einen Mauszeiger haben, der so aussieht:
Grau hinterlegte Pixel sind transparent, das schwarz/weiße Grafiksymbol zeigt an, dass dieses Pixel mit dem Untergrund XOR verknüpft werden soll. Der rote Kreis ist der Hotspot. Das Bild ist ein Screenshot des "Mouse Image Creator" Programms. Auf der linken Seite ist außerdem zu sehen, wie der Mauszeiger vor verschiedenen Hintergrundfarben aussehen wird. Die Pixel in der ersten Zeile haben entsprechend der Tabelle oben folgende Werte:
2, 2, 2, 0, 0, 0, 3, 1, 3, 0, 0, 0, 0, 2, 2, 2
Daraus ergeben sich die ersten beiden DATA-Werte zu 43021 und 49320.
Der komplette Mauspointer wird so definiert:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DATA 7, 7 ' Hotspot DATA 43021, 49320, 32781, 49160, 32781, 49160, 85, 21504 DATA 269, 49408, 269, 49408, 65021, 65020, 21847, 21844 DATA 65021, 65020, 269, 49408, 269, 49408, 85, 21504 DATA 32781, 49160, 32781, 49160, 43021, 49320, 0, 0 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Diesen Mauspointer und ein Beispiel zur Anwendung verschiedener Mauspointer finden Sie in der Beispieldatei "Mauszeiger und Freihandlinie" im Ordner "Beispiel\ Objekte\View und Content".
Erfahrene Programmierer werden hier sicher die Darstellung mit Hexadezimal-Zahlen bevorzugen.
SetPointerImageSetPointerImage liest einen Mauspointer aus Data-Zeilen und weist ihn dem View zu.Syntax im Basic-Code: <viewObj>.SetPointerImage Tipp: Kennzeichnen Sie den Mauspointer durch eine LABEL Anweisung und verwenden Sie die Anweisung RESTORE <LabelName> um einen bestimmten Mauspointer anzuwählen. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Label Pointer1 DATA hotX, hotY DATA imageWert1, ImageWert2, ... ' insgesamt 32 Image Werte | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ClearPointerImageClearPointerImage setzt einen Mauszeiger auf den Standard-Mauszeiger zurück.Syntax im Basic-Code: <viewObj>.ClearPointerImage ^4.9.2.7 Verlinkte ViewsGelegentlich ist es wünschenswert, dass Scroll-Operationen für mehrere Views gleichzeitig ausgeführt werden. Wenn Sie beispielsweise zwei (oder mehr) Views nebeneinander haben und das eine View hochscrollen kann es sinnvoll sein, dass die anderen Views automatisch mitscrollen. Man sagt dann, die Views sind miteinander "verlinkt". R-BASIC unterstützt die Verlinkung sowohl in horizontaler Richtung (Views teilen horizontale Scroll- und Scale-Ereignisse) als auch in vertikaler Richtung (Views teilen vertikale Scroll- und Scale-Ereignisse). Die geometrische Anordnung der Views auf dem Bildschirm spielt dabei keine Rolle.Zu den von den Views geteilten Ereignissen zählen auch das Setzen der Instancevariablen origin und scale sowie die Scroll Kommandos (Methoden ScrollCmd und ScrollToOffset). Die Verlinkung von Views muss immer zirkular erfolgen. Nehmen wir an, Sie haben 3 Views. Dann zeigt View1 auf View2, View2 auf View3 und View3 wieder zurück zu View1.
hLinkDie Instancevariable hLink enthält das nächste in horizontaler Richtung verlinkte View. Das letzte horizontal verlinkte View muss wieder zurück zum ersten View zeigen.Horizontal verlinkte Views senden horizontale Scroll- und Scale-Ereignisse automatisch an die anderen Views weiter.
Syntax UI-Code: hLink = <obj>
Lesen: <objVar> = <obj>.hLink
Schreiben: <viewObj>.hLink = <obj2>
vLinkDie Instancevariable vLink enthält das nächste in vertikaler Richtung verlinkte View. Das letzte vertikal verlinkte View muss wieder zurück zum ersten View zeigen.Vertikal verlinkte Views senden vertikale Scroll- und Scale-Ereignisse automatisch an die anderen Views weiter.
Syntax UI-Code: vLink = <obj>
Lesen: <objVar> = <obj>.vLink
Schreiben: <viewObj>.vLink = <obj2>
Beispiel: Die beiden Views sind sowohl horizontal als auch vertikal verlinkt und zeigen so immer den gleichen Bereich ihres Dokuments. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View DemoView1 ... hLink = DemoView2 vLink = DemoView2 END Object View DemoView2 ... hLink = DemoView1 vLink = DemoView1 END Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Achtung! Wenn Sie die View-Verlinkung zur Laufzeit ändern, müssen Sie selbst darauf achten, dass keine widersprüchlichen Verlinkungen entstehen. Falls Sie ein View zur Laufzeit vernichten wollen, müssen Sie sicherstellen, dass es nicht mehr mit anderen Views verlinkt ist. Verwenden Sie dazu die Funktion NullObj(). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
obj.hLink = NullObj() obj.vLink = NullObj() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
^4.9.2.8 Sonstige KonfigurationsoptioneninputOptionsPer Default sendet das View sowohl Maus- als auch Tastaturereignisse direkt an sein Content. Mit der Instancevariablen inputOptions können Sie einige Optimierungen vornehmen. InputOptions sind BitFlags, d.h. Sie können verschiedene Werte kombinieren.
Syntax UI-Code: inputOptions = numVal
Lesen: <numVar> = <obj>.inputOptions
Schreiben: <obj>.inputOptions = numVal
numVal: numerischer Wert: Siehe Tabelle
Folgende inputOptions stehen zur Verfügung:
focusableDie Instancevariable focusable bestimmt, ob das View den Focus bekommen kann (focusable = TRUE) oder nicht (focusable = FALSE). Der Defaultwert ist TRUE.
Syntax UI-Code: focusable = numVal
Lesen: <numVar> = <obj>.focusable
Schreiben: <obj>.focusable = numVal
numVal: numerischer Wert: TRUE oder FALSE
targetableViews erben die Instancevariable targetable von der GenericClass. Tragetable bestimmt, ob das View zum Target werden kann (targetable = TRUE, Defaultwert) oder nicht (targetable = FALSE).Um mit einem ViewControl zusammenzuarbeiten muss das View targetable sein. Außerdem muss das Bit VA_CONTROLLED in der Instancevariablen viewAttrs gesetzt sein.
holdsLargeTextDie Instancevariable holdsLargeText muss für das View und das zugehörige VisContent auf TRUE gesetzt werden, damit die View/Content Kombination mit einem LargeText Objekt zusammenarbeiten kann. Details dazu finden Sie im Kapitel 4.10.9 (VisText und LargeText) des Objekthandbuchs.
Syntax UI-Code: holdsLargeText = TRUE
Schreiben: <obj>.holdsLargeText = TRUE | FALSE
Children eines View-ObjektsIm Normalfall besitzt ein View keine Children. Möglich ist das jedoch, da ein View von der GenericClass abstammt. Um die Children innerhalb des View zu platzieren, können Sie den Children die - ebenfalls von der GenericClass geerbten Hint placeObject geben. Dieser bestimmt, in welchem Bereich des View das Child platziert werden soll. Dabei stehen die folgenden Werte zur Verfügung:
Beispiel: Platziere eine Button unter dem View | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
View MyView Children = MyButton <... > END Button MyButton Caption$ = "Neu zeichnen" placeObject = 512 < .. > END Object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
^4.9.3 VisContentObjekte der Klasse VisContent dienen primär dazu, Grafiken in einem skalierbaren und scrollbaren View auszugeben. Sie können außerdem auf Tastatur- und Mauseingaben reagieren. Das VisContent-Objekt muss nur die Grafik bereitstellen, das View-Objekt kümmert sich um den darzustellenden Bereich, Scrolling und Zoom. VisContent Objekte können Children der Klasse VisObj haben, die ihrerseits Grafik ausgeben und auf Tastatur und Maus reagieren können.Eine ausführliche Beschreibung der VisContent Klasse finden Sie im Objekthandbuch, Kapitel 5.4.
4.9.4 BitmapContentObjekte der Klasse BitmapContent verwalten eine editierbare Bitmap. Bitmaps sind digitalisierte Bilder. Sie bestehen aus einer rechteckigen Anordnung von einzelnen Bildpunkten (Picture Element: Pixel). Jedem Pixel kann eine eigene Farbe zugeordnet werden. In die Bitmaps der Klasse BitmapContent kann Text oder Grafik geschrieben werden. Das BitmapContent-Objekt legt die zugehörige Bitmap automatisch selbst an, so dass sie sofort benutzt werden kann.Die BitmapContent Klasse ist von der VisContent Klasse abgeleitet. Sie erbt daher die meisten ihrer Fähigkeiten und Eigenschaften. Von besonderer Bedeutung ist dabei die Fähigkeit, auf Tastatur- und Mauseingaben zu reagieren.
Eine ausführliche Beschreibung der BitmapContent Klasse finden Sie im Objekthandbuch, Kapitel 5.2.
4.9.5 GenContentGenContent-Objekte haben keine eigenen Maus- oder Tastaturhandler, sondern leiten diese Ereignisse wie eine Group direkt an ihre Children weiter. Wenn Sie ein GenContent-Objekt zur Laufzeit einem View zuweisen wird es automatisch visible gesetzt. Umgekehrt wird es automatisch not visible gesetzt, wenn Sie es von einem View abkoppeln.
Abstammung:
Spezielle Instance-Variablen:
Tipp: Wenn die Anordnung der Children im GenContent nicht so ist, wie Sie wünschen, sollten Sie eine Group als Child des GenContent anlegen und ihre Objekte innerhalb dieser Group anordnen. KeepFocusVisibleDer Hint keepFocusVisible sorgt dafür, dass das Objekt, das den Focus hat, nicht aus dem sichtbaren Bereich herausgescrollt wird.
Syntax UI-Code: KeepFocusVisible
Lesen: --
Schreiben: --
contentAttrsDie Instancevariable contentAttrs enthält diverse Konfigurationsbits.Syntax UI-Code: contentAttrs = attrsToSet , attrsToClear Lesen: <numVar> = <obj>.contentAttrs (0) Die BASIC-Syntax erfordert beim Lesen von contentAttrs einen Parameter. Der Wert wird hier ignoriert. Schreiben: <obj>.contentAttrs = attrsToSet , attrsToClear attrsToSet: zu setzende Attribute, Bitflags, siehe Tabelle attrsToClear: zu setzende Attribute, Bitflags, siehe Tabelle
Bits, die in der Tabelle nicht aufgeführt sind sollten Sie nicht setzen. Das kann zu unerwarteten Ergebnissen führen. Bedeutung der einzelnen Bits:
^4.9.6 ViewControlDas einzige, was Sie tun müssen, damit ein View mit dem ViewControl zusammenarbeitet ist, das Bit VA_CONTROLLED in der Instancevariablen viewAttrs des View-Objekts zu setzen. Außerdem müssen Sie für genau ein View den Hint "defaultTarget" setzen.
Üblicher Weise hat ein Programm genau ein ViewControl-Objekt, das ein Child des "Ansicht" Menüs ist. Ein Codebeispiel finden Sie am Ende des Kapitels. Abstammung:
Spezielle Instance-Variablen:
Methoden:
vcFeaturesDie Instancevariable vcFeatures stellt ein, welche UI das ViewControl-Objekt bereitstellen soll. Jedes Bit des Wertes steht für eine Eigenschaft, die einzeln zu- oder abgeschaltet werden kann. Die Arbeit mit Bitflags ist im Programmierhandbuch, Vol. 2, Kapitel 2.3.5.4 beschrieben.
Syntax UI-Code: vcFeatures = numVal
Lesen: <numVar> = <obj>.vcFeatures
Schreiben: <obj>.vcFeatures = numVal
numVal: numerischer Wert, Bitflags, siehe Tabelle
Die folgenden Features stehen zur Verfügung. Per Default sind alle Features aktiviert, mit Ausnahme von "Aspektverhältnis umrechnen" und "Alle Fenster vergrößern / verkleinern".
vcMinZoomDiese Instancevariable enthält den kleinstmöglichen Scale-Faktor in Prozent. Der Defaultwert ist 25.
Syntax UI-Code: vcMinZoom = numVal
Lesen: <numVar> = <obj>.vcMinZoom
Schreiben: <obj>.vcMinZoom = numVal
numVal: numerischer Wert, in Prozent
vcMinZoomDiese Instancevariable enthält den größtmöglichen Scale-Faktor in Prozent. Der Defaultwert ist 400. Wenn Sie den Wert auf unter 400 setzen sollten Sie auch das Bit VCF_BIG_ENLARGE in der Instancevariable vcFeatures zurücksetzen.
Syntax UI-Code: vcMaxZoom = numVal
Lesen: <numVar> = <obj>.vcMaxZoom
Schreiben: <obj>.Max = numVal
numVal: numerischer Wert, in Prozent
vcAttrsDie Instancevariable vcAttrs enthält die Information, ob die Einstellungen aus dem Untermenü "Ansichts-Optionen" an die betroffenen Views gesendet werden sollen oder nicht. Ein Zugriff im BASIC-Code ist im Allgemeinen nicht erforderlich. Im UI-Code können Sie vcAttrs zur Konfiguration der Default-Werte für das Untermenü "Ansichts-Optionen" verwenden (siehe Beispiel unten).
Syntax UI-Code: vcAttrs = attrsToSet, attrsToClear
Lesen: <numVar> = <obj>.vcAttrs (0)
Da vcAttrs zwei Parameter hat erfordet die BASIC-Syntax,
dass der zu lesende Wert angegeben wird. Der übergebene
Wert wird hier jedoch ignoriert.
Schreiben: <obj>.vcAttrs = attrsToSet, attrsToClear
attrsToSet, attrsToClear: numerischer Wert, Bitflags, siehe Tabelle
Dieses Feld wird vom ViewControl Objekt automatisch verwaltet. Klickt der Nutzer z.B. auf "Horizontale Bildlaufleiste ein-/ausblenden" im Ansicht-Menü so wird das entsprechende Bit in vcAttrs automatsch angepasst. Jedes Bit des Wertes steht für eine Eigenschaft, die einzeln zu- oder abgeschaltet werden kann. Die Arbeit mit Bitflags ist im Programmierhandbuch, Vol. 2, Kapitel 2.3.5.4 beschrieben. Die folgenden Konstanten stehen zur Verfügung:
ScaleView100
Diese Methoden bewirken, dass das ViewControl die in der Tabelle aufgelisteten Kommandos an das kontrollierte View sendet. Sie können damit z.B. Toolbuttons realisieren, die die wichtigsten Operationen des View-Menüs auslösen können. Ein Beispiel finden Sie im Ordner Beispiel\Objekte\View-Content in der Datei "ViewControl Tool Demo". Um die grafischen Captions dieses Beispiels nutzen zu können müssen Sie mindestens die Version 2 des Pakets "More Tool Images" von der R-BASIC Webseite installiert haben.
|
| Methode | Aufgabe |
|---|---|
| ScaleView100 | "Normalgröße" aktivieren |
| ScaleViewToFit | "Größe anpassen" aktivieren |
| ZoomInView | "Vergrößern" aktivieren |
| ZoomOutView | "Verkleinern" aktivieren |
| RedrawView | "Aktualisieren" aktivieren |
| ScrollLeftView | View nach links scrollen |
| ScrollRightView | View nach rechts scrollen |
| ScrollUpView | View nach oben scrollen |
| ScrollDownView | View nach unten scrollen |
Syntax Lesen: <objVar> = <obj>.targetView
Beispiele Im einfachsten Fall müssen Sie das ViewControl-Objekt nicht konfigurieren.
Menu DemoViewMenu Caption$ = "Ansicht" Children = DemoViewControl End Object ViewControl DemoViewControl End Object
View DemoView DefaultTarget viewAttrs = VA_CONTROLLED, 0 ... END Object
Wir wollen folgendes:
Das zugehörige ViewControl sieht dann so aus:
ViewControl DemoViewControl
vcFeatures = VC_DEFAULT_FEATURES + VCF_APPLY_TO_ALL \
- VCF_BIG_ENLARGE
vcMaxZoom = 200
' Default-Werte für Ansichts-Optionen setzen
vcAttrs = VCA_APPLY_TO_ALL, VCA_SHOW_HORIZONTAL
End Object