CODING ★ BENUTZEROBERFLAECHE CEUS V1.0 - TEIL 4: DIE BILDSCHIRMSTEUERUNG (CPC AMSTRAD INTERNATIONAL) ★

Menu - RSXBenutzeroberflaeche CEUS v1.0 - Teil 4: Die Bildschirmsteuerung (CPC Amstrad International)
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Diese Folge unserer Serie über die Programmierung grafischer Benutzeroberflächen auf dem CPC beschäftigt sich eigens mit den sogenannten Icons, die zu Unrecht häufig mit jenen religiösen Kunstwerken verwechselt werden (ein Menü hat schließlich auch nur selten mit dem Essen zu tun).

So, die Windows hätten wir ja jetzt, aber das ist ja längst noch nicht alles. Erinnern wir uns an die erste Folge: Da stand über grafische Benutzeroberflächen, daß sie versuchen, einem einen 'normalen' Schreibtisch so originalgetreu wie möglich nachzubildcn. Das Papier (die Windows) hätten wir ja bereits (damit wären wir dem Traum vom papierlosen Büro schon wesentlich näher gekommen), aber es fehlen da noch sehr wichtige Dinge.

Anvisieren und “feuern“

Zuerst wäre da einmal die Hand, mit der man nach einem Gegenstand greifen kann. Diese Hand wird (um das Ganze zu vereinfachen — manche Benutzeroberflächen verwenden wirklich stilisierte Hände) bei uns durch einen Pfeil symbolisiert. Dieser Pfeil kann nun vom Benutzer auf dem Bildschirm herumbewegt werden, ungefähr so, wie man mit dem Finger über einer Schreibmaschinentastatur herumfährt: kreisen und zustoßen. Gesteuert wird der Pfeil normalerweise von einer Maus. Da die wenigsten CPC-Besitzer eine solche haben, läßt sich unser Pfeil auch mit den Cursortasten oder dem Joystick bewegen. Sobald man nun das gewünschte Ziel auf dem Bildschirm erreicht hat, wird dem Computer die gewünschte Auswahl deutlich gemacht. In unserem Fall geschieht das durch Drücken von Teuer' oder 'Copy'. Ist dies geschehen, sollten die Koordinaten der Pfeilspitze an den Benutzer zurückgegeben werden. Fertig. Für diese Aufgabe ist ein Befehl namens ICURSOR zuständig, der den Cursor darstellt und die Tastatur abfragt. Parameter gibt es keine, die Koordinatenübergabe erfolgt — etwas ungewöhnlich aber ungemein praktisch — über die Koordinaten des Grafikcursors, das heißt, man kann den Pfeil mit 'MOVE X,Y' an eine beliebige Stelle setzen und seine Position hinterher über 'XPOS' und 'YPOS' abfragen.

Dadurch ist es zum Beispiel auch ohne große Probleme möglich, den Cursor eines Grafikprogramms mit dieser Routine zu steuern.

Pfeilschnell

Nach dem Aufruf des Befehls werden zuerst die Bildschirmkoordi-nalen mit Hilfe der Origin-Werte in physikalische Koordinaten umgerechnet. Danach wird der Cursor zuerst einmal dargestellt. Die Darstellung ist überhaupt das größte Problem der Routine, denn sie muß... a)...schnell, b)... möglichst kurz (siehe Speicher) und c)...für alle Bildschirmmodi geeignet sein. Um das Problem nicht übermäßig aufzublasen, wurde eine acht Byte große Matrix für den Pfeil verwendet, das heißt, der Pfeil ist in jedem Modus ein Byte breit und acht Byte hoch. Das führt dazu, daß der Pfeil im Mode 2 acht Pixel, im Mode 1 vier Pixel und im Mode 0 nur zwei Pixel breit ist. Aus diesem Grund müssen im Mode 0 Abstriche am Aussehen des Pfeils gemacht werden, aberden Sinn und Unsinn der Programmierung einer Benutzeroberfläche im Mode 0 haben wir ja an anderer Stelle in dieser Serie bereits besprochen. Die Darstellung des Cursors erfolgt durch einfaches Invertieren der entsprechenden Bildpunkte. Das hat den Vorteil, daß der Cursor immer sichtbar ist und er durch einfaches Wiederholen des Vorgangs wieder abgebaut werden kann. Sobald der Pfeil einmal dargestellt ist, folgt der nächste Teil: die Tastaturabfrage und Koordinatenkorrektur am Cursor. Die Tastaturabfrage geschieht in einer gesonderten Unterroutine. Wird eine Taste als gedrückt erkannt, baut sich der Cursor zunächst wieder ab und korrigiert danach die Koordinaten.

|CURSORStellt einen pfeilförmigen Cursor auf dem Bildschirm dar, der mit Joystick oder Cursortasten/Copy gesteuert werden kann. Koordinatenübergabe erfolgt über die Grafik-Cursor-Koordi-naten (mit MOVE, beziehungsweise XPOS und YPOS)
|DEFICON, n u m, ic$Definiert das Icon mit der Nummer num über den String ic$ (=chr$(bte 1)+chr$(bte2)...).
(num ist Zahl zwischen 0 und 255, ic$ ist ein String mit der maximalen Länge 144.)
|ICON,x,y,nuniStellt das Icon mit der Nummer num an der Stelle X, Y auf dem Bildschirm dar. (x,y sind Bildschirmkoordinaten im Bereich 0/0 bis 640/400.)
|GETICON,@mim%Fragt mit dem Cursor die auf dem Bildschirm dargestellten Icons ab und gibt in num% eine Iconnummer zurück.
|FILL,bteFüllt den Bildschirmspeicher mit dem Wert bte (bte ist ein Byte, Wert zwischen 0 und 255.)


Beschleunigen wie ein Ferrari

Diese Koordinatenkorrektur ist dann auch gleich das nächste Problem: Der Cursor sollte zwar einerseits relativ genau sein, um einen Punkt sicher treffen zu können, andererseits sollte er auch nicht wie eine Schildkröte mit Reifenpanne über den Bildschirm kriechen. Die Lösung für dieses Problem liegt in der sogenannten dynamischen Auflösung -auch bekannt als beschleunigte Bewegung des Cursors. Das Prinzip ist ganz einfach: Man geht hin und beginnt mit einer Auflösung von zum Beispiel 2 Punkten (kann auch reduziert werden; siehe Listing). In diesem Modus ist es durchaus noch möglich, kleinere Bildausschnitte gezielt anzufahren. Hält man nun eine Taste gedrückt, so wird die Schrittweite des Cursors bei jedem Durchlauf um zwei Punkte erhöht, beim zweiten Mal springt er dann also schon vier Punkte weit, beim dritten Mal sechs und so weiter. Läßt man die Taste wieder los, so wird der Zähler zurückgesetzt, und man hat wieder die hohe Auflösung vom Beginn. Durch diesen Kompromiß ist es möglich, einerseits ziemlich genau zu arbeiten und andererseits doch ziemlich schnell größere Strecken zurückzulegen. Wenn nun FEUER oder COPY gedrückt wurde, werden die Koordinaten wieder in den ursprünglichen Bereich gesetzt (über die Origin-Koordinaten) und der Tastaturpuffer geleert.

Mögen Sie Kunst?

Der zweite Teil der Bildschirmsteuerung handelt von den sogenannten Icons. Das sind kleine 'Bildchen' (in unserem Fall 6x24 Byte, also 48x48 logische Pixel groß), die eine bestimmte Funktion oder einen Gegenstand repräsentieren. Sie werden zum Beispiel dazu verwendet, die Einträge eines Directories auf dem Bildschirm grafisch darzustellen oder verschiedene Unterprogramme zu repräsentieren (siehe erste Folge). Definiert werden diese Icons mit dem Befehl

|DEFICON,num,@ic$, wobei num eine Zahl zwischen 0 und 255 und ic$ ein String mit einer Länge von bis zu 144 Byte sein müssen, num ist die Nummer des Icons, sie wird für alle Befehle verwendet, ic$ enthält das Icon selbst beziehungsweise einen Teil des Icons. Der Inhalt von ic$ ist dabei modusabhängig und setzt sich folgendermaßen zusammen: Der String beginnt mit dem linken oberen Byte des Icons, dann folgt das rechts davon gelegene und so weiter Zeile für Zeile nach dem Schema ic$= chr$(bte1)+ chr$(bte2) ... +chr$(bte). Ist die Länge von ic$ kleiner als 144 (die Maximalgröße), so wird nur dieser Teil des Icons definiert. Man kann dies auch dazu verwenden, um nur die ersten paar Zeilen eines bereits definierten Icons um-zudefmieren. Ist ein Icon noch nicht definiert, so wird wie bei |WINDOW.IN ein neuer Speicherbereich über GET-MEM belegt. Damit ergibt sich ein neues Problem für unsere MEMFRE-Routine, die daher nochmals um einen Block zur Behandlung der Icons erweitert werden muß.

Video - ich sehe!

Wenn wir unsere Icons jetzt definiert haben, wollen wir sie ja auch darstellen. Dazu ist der Befehl |ICON,x,y ,num da, der nichts anderes tut, als das Icon mit der Nummer num einfach an den Koordinaten X,Y darzustellen (die Koordinaten geben die Position der linken oberen Ecke an und werden auf ganze Byte-Werte gerundet).

ACHTUNG: Der Hintergrund hinter einem Icon wird nicht gerettet!

Man kann übrigens dasselbe Icon durchaus an zwei verschiedenen Stellen des Bildschirms darstellen, bei jeder Darstellung eines Icons wird jedoch einer der 255 zur Verfügung stehenden Plätze reserviert, die Icon-Flut ist also nicht unendlich. Braucht man einmal keins mehr, so kann diese Tabelle durch einen MODE-Befehl zurückgesetzt werden. Dieser erhält dazu einen Patch, durch den der Zähler für die Anzahl der dargestellten Icons einfach auf 0 gesetzt wird.

Aber bitte mit Sahne

So, nun haben wir Icons definiert und dargestellt, was fehlt, ist die Icon-Abfrage. Sie ist im Prinzip wieder wirklich einfach. Der Befehl

|GETICON,@num%

ruft die Routine |CURSOR auf und wertet nach deren Beendigung die zurückgelieferten Koordinaten aus. Befindet sich der Cursor auf einem dargestellten Icon, dann wird dessen Nummer in der Variablen num% zurückgegeben, ansonsten geht es zur Cursorroutine zurück. Zuletzt enthält die Bildschirmsteuerung noch den Befehl

|FILL,bte,

der einfach den ganzen Bildschirmspeicher mit dem Wert bte vollschreibt; damit lassen sich ziemlich einfach Hintergrundmuster definieren. Das war es dann schon wieder für dieses Mal. In der nächsten Folge folgt dann der Rest, also Menüs, Alertboxen und die Softwareuhr. Damit bis dahin niemand an Langeweile stirbt (kann ich mir bei DEN Assem-blerlistings allerdings nicht vorstellen), gibt's auch diesmal wieder einen Tip zum Seiberprogrammieren: Wie wär's mit einer Routine, die neben den Icons auch geöffnete Fenster berücksichtigt, und die Nummer des Fensters, über dem sich der Cursor befindet, zurückgibt? Man könnte sie beispielsweise durch Nummern (über '255') von den Icons unterscheiden (01 ins High-Byte der Integervariable schreiben). Datür gäbe es sicherlich eine Menge sinnvoller Anwendungen, zum Beispiel in Verbindung mit dem POP-Befehl, und so unheimlich schwer ist das eigentlich nicht.

Jörg Schwieder/jf, CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1990
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: ???
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1990
★ AUTHOR: Joerg Schwieder

 

Page précédente : Benutzeroberflaeche CEUS v1.0 - Teil 3: Der Window Manager (komplett)
★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-CEUS  v1-SOURCEPACK    GERMANDATE: 2020-04-18
DL: 678
TYPE: ZIP
SiZE: 20Ko
NOTE:
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » Profi-RSX 2 (CPC Amstrad International)
» Applications » Instant Access
» Applications » RSX Sintetizador de Voz
» Applications » Trace (CPC Amstrad International)
» Applications » Format (Compute Mit)
» Applications » RSX Select (Schneider Aktiv)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 394 millisecondes et consultée 824 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.