Cursor an GEM-Textattribute anpassen

Sie haben ein hypersupergutes Programm zur Darstellung von mathematischen Funktionen oder Balkendiagrammen oder ein Malprogramm oder, oder... geschrieben. Was Ihnen noch fehlt, ist eine Routine, mit der Sie in der Lage sind, Ihre Grafiken und Bilder perfekt und variabel zu beschriften. Hier ist sie.

Texte können mit dieser Prozedur an beliebiger Stelle mit Ausnutzung aller GEM-Textattribute eingelesen werden. Texteingaben im rechten Winkel oder auf dem Kopf sind kein Problem.

Die Texteingabe erfolgt mit den gerade aktuellen Attributen, die von der Prozedur, soweit nötig, selbständig erkannt werden. Eine Korrektur mit Backspace ist möglich.

Der Clou ist aber, daß die Größe des Cursors immer der Größe der gerade gewählten Schriftgröße automatisch angepaßt wird. Ist die Schrift um 90° gedreht, wird auch der Cursor um diesen Winkel gedreht.

Arbeitsweise des Programms

Zu Beginn können die verschiedenen Textattribute eingestellt werden. In der Procedure TEXT werden zunächst durch die Procedure ZEICHENGRÖSSE die Größe und der Winkel des auszugebenden Textes bestimmt. Die Verschiebung in X- und Y-Rich-tung , die nach der Ausgabe eines Zeichen erfolgt, wird in den Variablen X% und Y% festgehalten. Hier wird auch die X- und Y-Ausdehnung des Cursors in C_x% und Cj% festgelegt. Außerdem muß er etwas verschoben zur Baseline dargestellt werden. Diese Verschiebung wird in Cd_x% und Cd_y% festgelegt.

Als nächstes schaltet man mit der Procedure RAND die Umrandung beim Zeichnen eines gefüllten Rechtecks mit PBOX ab, da es sonst im Graphmode 3 (XOR) zu unschönen Fehlern kommt.

Nun wird der Cursor auf dem Bildschirm dargestellt. Er ist mit Hilfe der Maus über den Bildschirm zu bewegen.

Mit der rechten Maustaste kann die Eingabe abgebrochen werden, mit der linken Maustaste oder einem beliebigen Tastendruck erfolgt der Start der Textausgabe. Der eingegebene Text wird in der Variablen TEXT$ gespeichert.

Nach Beendigung der Eingabe mit RETURN wird der Text noch einmal im durch "Schreib_mode%' festgelegten Graphmode ausgegeben, da die Darstellung bis dahin im nicht sehr schönen Graphmode 3 erfolgte (Hintergrundmuster machen die Schrift schwer lesbar). Erfolgt die Ausgabe im Transparentmodus, wird der Hintergrund, auf dem der Text geschrieben wird, nicht gelöscht (auf schwarzem Hintergrund wären die Buchstaben nicht zu sehen). Im Replacemodus wird dagegen der Hintergrund gelöscht (allerdings löschen sich Buchstaben, wenn sie kursiv und groß geschrieben werden, teilweise gegenseitig aus).

Der Cursor kann nun wieder frei auf dem Bildschirm bewegt werden und mit einem Druck auf die linke Maustaste wird die Ausgabe mit den gleichen Textattributen fortgesetzt.

Durch einen Druck auf die rechte Maustaste läßt sich das Programm beenden. Die Einstellungen der Textattribute können damit auch verändert und dann die Textausgabe mit den neuen Einstellungen fortgesetzt werden.

Die Abfrage der Textattribute ist natürlich so wie hier gezeigt nicht sehr komfortabel. Sie läßt sich z.B. durch Dialogboxen wesentlich besser durchführen. Aber bei diesem Programm geht es ja auch mehr um die Darstellung des Cursors trotz der verschiedenen Texteinstellungen.

Nun wünsche ich noch viel Spaß mit dieser kleinen Routine - und in Zukunft möchte ich kein Programm mehr sehen, das die GEM-Texteinstellungen benutzt und keinen vernünftigen Cursor auf den Bildschirm bringt.

' Cursor an GEM-Textattribute anpassen 
' (C) 1988 Tom Quellenberg, Petersenweg 8,2820 Bremen T7
'
'
Cls
Sget Bild$
Repeat
    Alert 2,"Endgültige Ausgabelmit Schreibmodus",1,"replace|transpar",Antw%
    Schreib_mode%=Antw%
    Print At(0,10)
    Input "Textstil <0..31> :",Text_mode%
    Input "Ausgabewinkel <0,90,180,270> :",Winkel% 
    Mul Winkel%,10
    Input "Textgröße <0..27> :",Text_groesse%
    Sput Bild$
    Deftext 1,Text_mode%,Winkel%,Text_groesse%
    @Text
    Sget Bild$
    Alert 2,"Programm beenden ?",1," Ja |Nein",Antw%
Until Antw%=1 
End
'
Procedure Zeichengroesse 
    Lpoke Contrl+2,0 
    Lpoke Contrl+6,0 
    Vdisys 38
    Zeichenbreite%=Dpeek(Ptsout+4) 
    Zeichenhoehe%=Dpeek(Ptsout+6) 
    C_delta%=Zeichenhoehe%-Dpeek(Ptsout+2)
    Winkel%s=Dpeek(Intout+4)
    Clr Cd_x%,Cd_y%,X%,Y%
    If Winkel%=0
        X%=Zeichenbreite%
        C_x%=X%-1
        C_y%=-Zeichenhoehe%+1
        Cd_y%=C_delta%-1
    Endif
    If Winkel%=900
        Y%=-Zeichenbreite%
        C_x%=-Zeichenhoehe%+1
        C_y%=Y%+1 
        Cd_x%=C_de1ta%-1 
    Endif
    If Winkel%=1800
        X%=-Zeichenbreite%
        C_x%=X%+1
        C_y%=Zeichenhoehe%-1
        Cd_y%=-C_delta%+1
    Endif
    If Winkel%=2700
        Y%=Zeichenbreite%
        C_x%=Zeichenhoehe%-1
        C_y%=Y%-1
        Cd_x%=-C_delta%+1
    Endif
Return
'
Procedure Cursor
    Pbox Xpos%+Cd_x%,Ypos%+Cd_y%,Xpos%+C_x%+Cd_x%,Ypos%+C_y%+Cd_y%
Return
'
Procedure Rand(F!)
    Dpoke Contrl+2,0 
    Dpoke Contrl+6,1 
    If F!
        Dpoke Intin,1 
    Else
        Dpoke Intin,0 
    Endif
    Vdisys 104 
Return
'
Procedure Text 
    @Zeichengroesse 
    Deffill 1,1 
    @Rand(False)
    Graphmode 3
    Hidem
    Do
        @Cursor
        Repeat
            Mouse Xm%,Ym%,Km%
            If Xm%<>Xpos% Or Ym%<>Ypos%
                @Cursor 
                Xpos%=Xm%
                Ypos%=Ym%
                @Cursor
            Endif
        Until Km%<>0 Or Inkey$<>""
        @Cursor 
        Exit If Km%=2 
        Weiter:
        Text$=""
        Do
            @Cursor
            Repeat
                A$=Inkey$
            Until A$<>""
            Z%=Asc(A$)
            @Cursor 
            Exit If Z%=13 
            If Z%>0 And Z%<>8 
                Text$=Text$+A$
                Text Xpos%,Ypos%,A$
                Add Xpos%,X%
                Add Ypos%,Y%
            Endif 
            If Z%=8
                Sub Xpos%,X%
                Sub Ypos%,Y%
                If Text$<>""
                    Alt%=Asc(Right$(Text$))
                    Text$=Left$(Text$,Len(Text$)-1) 
                    Text Xpos%,Ypos%,Chr$(Alt%) 
                Endif 
            Endif 
        Loop
        If Text$<>""
            Graphmode Schreib_mode%
            For I%=Len(Text$) Downto 1 
                A%=Asc(Mid$(Text$,I%))
                Sub X_pos%,X%
                Sub Y_pos%,Y%
                Text X_start%,Y_start%,Chr$(A%) 
            Next I%
            Graphmode 3 
        Endif 
    Loop 
    Showm
    Graphmode 1 
    @Rand(True)
Return

Tom Quellenberg
Aus: ST-Computer 04 / 1989, Seite 86

Links

Copyright-Bestimmungen: siehe Über diese Seite