Radieren auf dem Bildschirm

Dieser Beitrag beschreibt eine Routine, mit der eine wichtige Standardfunktion realisiert werden kann: der “Radiergummi” zur Korrektur von Fehlern, die bei der Erstellung von Grafiken zwangsläufig vorkommen.

Prinzipiell teilt sich die Routine in zwei Abschnitte:

Die Radierbox, deren Dimensionen nach Aufruf der Prozedur frei bestimmt werden können. Die Box muß auf dem Bildschirm an jeder beliebigen Position mit der Maus plazierbar sein, da sie den zu löschenden Bildausschnitt markieren soll.

Während die Radierbox den zu löschenden Bildausschnitt markiert, sorgt die Löschbox für das eigentliche "Radieren" des Ausschnitts. Damit sich der Bildschirm nach eventuellen Fehllöschungen wieder restaurieren läßt, ist außerdem eine UNDO-Funktion vorgesehen. Betrachten wir nun das Listing:

Radierbox

Nach dem Aufruf der Procedure Radieren erscheint am linken Bildschirmrand eine Box mit voreingestellter Größe. Diese Größe kann nach dem Prinzip des "Gummibands" (Rubberbox) mit der Maus auf die gewünschten Maße gebracht werden. Die Dimensionierung wird durch Mausklick beendet. Das so gewonnene Markierungssymbol befindet sich nun für die weitere Verwendung in der String-Variablen Rad$.

Durch den Aufruf der Procedure Set_m(300,199) erscheint die Radierbox anschließend in der Bildschirmmitte. Von dort aus kann sie durch Mausbewegung an die gewünschte Position gebracht werden. Das Prinzip, nach dem die Verschiebung der Radierbox vor sich geht, ist im Artikel "Variable Bildausschnitte", ST-Computer, 3/89, S.88ff.. näher erläutert.

Löschbox

Nach einem Mausklick mit der linken Taste wird die mit der Radierbox markierte Fläche für die UNDO-Funktion zunächst gepuffert. An der Position der Radierbox zeichnet das Programm jetzt mit den Offset-Werten Xd% und Yd% die Löschbox. Aufgrund von Deffill 0 überdeckt diese den fehlerhaften Bildausschnitt, und die Radierfunktion ist ausgeführt. Die Routine springt nun in die Verschiebeschleife zurück. Von dort aus kann mit der UNDO-Taste der Bildschirm restauriert oder mit der linken Maustaste eine weitere Löschung vorgenommen werden. Mit der rechten Maustaste wird die Routine in Richtung Hauptprogramm verlassen.

Literatur:

Hans-H. Ackermann.
Variable Bildausschnitte,
ST-Computer 3/89, S.88ff.,
ST-Computer 5/89, S.179

' (C) MAXON Computer GmbH 
DIM m$(18)          !Menü erstellen
RESTORE mmenue 
FOR z%=0 TO 17 
    READ m$(z%)
NEXT z% 
mmenue:
DATA DESK  ,  INFO,--------------------
DATA 1,2,3,4,5,6,""
DATA DEMO  ,  Zeichnen ,  Radieren ,----------------,  Quit,"","",""
'
MENU m${)
@menu
'
PROCEDURE menu
    DO                          !Auf Ereignis
        ON MENU                 !warten
        ON MENU GOSUB auswahl   !und verzweigen 
    LOOP
RETURN
'
PROCEDURE auswahl               !Auswahl treffen
    WHILE MOUSEK<>O 
    WEND
    MENU OFF 
    IF MENU(0)=1 
        @copyright 
    ENDIF
    IF MENU(0)=11 
        @zeichnen 
    ENDIF
    IF MENU(0)=12
        @radieren
    ENDIF
    IF MENU(0)=14 
        END 
    ENDIF 
RETURN
'
PROCEDURE radieren 
    REPEAT 
        ON MENU 
    UNTIL MOUSEK=0
    DEFMOUSE 5                      ! Fadenkreuz
    xx%=10                          ! Linke-obere Ecke
    yy%=60                          ! der Radierbox und
    @set_m(20,90)                   ! Default für rechte untere Ecke
    GRAPHMODE 3
    WHILE MOUSEK=0                  ! Rahmen-Schleife
        MOUSE x%,y%,k%
        '
        IF x%<xx%                   !Keine "negativen"
            @set_m(xx%,y%)          !für rechte-untere
        ENDIF 
        IF y%<yy%
            @set_m(x%,yy%)
        ENDIF
        '
        BOX xx%,yy%,x%,y%           ! Radierbox zeigen
        REPEAT                      ! bis Maustaste losgelassen 
        UNTIL MOUSEK=1 OR MOUSEX<>x% OR MOUSEY<>y%  ! oder Maus bewegt 
        BOX xx%,yy%,x%,y%           ! Radierbox löschen
    WEND
    GET xx%,yy%,x%,y%,sav$          ! Hintergrund retten 
    GRAPHMODE 1                     ! und
    DEFFILL 0                       ! für
    PBOX xx%+1,yy%+1,x%-1,y%-1      ! Radierbox säubern 
    DEFFILL 1,1
    BOX xx%,yy%,x%,y%               ! Radierbox endgültig zeichnen 
    GET xx%,yy%,x%,y%,rad$          ! und puffern
    GRAPHMODE 3
    BOX xx%,yy%,x%,y%               ! Radierbox löschen&
    PUT xx%,yy%,sav$                ! Hintergrund restaurieren
    '
    xd%=x%-xx%                      ! Boxmaße für
    yd%=y%-yy%                      ! Offset berechnen
    @set_m(300,199)                 ! Radierbox in Bildmitte
    '
    WHILE MOUSEK<>O 
    WEND
    DO                              ! Radierschleife
        WHILE MOUSEK=0              ! Verschiebeschleife
            MOUSE x%,y%,k%
            HIDEM
            SGET bild$              ! Hintergrund puffern
            PUT x%,y%,rad$,6        ! Radierbox zeigen
            WHILE MOUSEX=x% AND MOUSEY=y% AND MOUSEK=0 ! warten
                HIDEM
                IF INKEY$=CHR$(0)+CHR$(97) ! UNDO
                    PUT x%,y%,rad$,6 ! Radierbox löschen
                    PUT ux%,uy%,und$ ! Bild restaurieren 
                    SGET bild$       ! Hintergrund puffern
                    PUT x%,y%,rad$,6 ! Radierbox zeigen
                ENDIF 
            WEND
            SPUT bild$               ! Hintergrund über Radierbox legen
        WEND
        '
        WHILE MOUSEK=1 AND MOUSEY>20 ! Wenn linke MT gedrückt und 
            MOUSE ux%,uy%,k%         ! Radierbox außerhalb
            HIDEM                    ! Menü-Leiste
            DEFFILL 0 
            GRAPHMODE 1
            GET ux%,uy%,ux%+xd%,uy%+yd%,und$    ! Fläche für UNDO puffern 
            PBOX ux%,uy%,ux%+xd%,uy%+yd%        ! löschen 
            DEFFILL 1,1,
            WHILE MOUSEK=1 
            WEND 
        WEND
        EXIT IF MOUSEK=2 
    LOOP 
    REPEAT 
        ON MENU 
    UNTIL MOUSEK=0 
    SHOWM
    DEFMOUSE 0 
    DEFFILL 1,1,
    GRAPHMODE 1 
RETURN
'
PROCEDURE copyright 
    SGET bild$
    GRAPHMODE 1 
    DEFFILL 0
    PBOX 80,74,570,296 
    DEFFILL 1 
    BOX 80,74,570,296 
    BOX 84,80,566,290 
    DEFTEXT ,,,26
    TEXT 165,136," R a d i e r e n "
    DEFTEXT ,,,13
    TEXT 230,170,"in  GfA-Basic (V.2.02)”
    TEXT 240,270," Hans-H.Ackermann "
    DEFTEXT ,,,6
    TEXT 285,280," 1989 "
    TEXT 234,268,CHR$(189)
    REPEAT
    UNTIL MOUSEK<>O
    SHOWM
    SPUT bild$
    @menu
RETURN
'
PROCEDURE zeichnen      !Demo-Graphik
    ERASE f$()
    DIM f$(4)
    BOX 80,130,570,280 
    DEFTEXT ,,,13 
    t$="Radieren mit der Maus"
    FOR z%=0 TO 3
        TEXT 120+(40*z%),154+(38*z%),t$
    NEXT z %
    FOR z%=0 TO 4
        PBOX 32 0+ (45*z%),136+(24*z%),350+(45*z%),170+(24*z%)
        DEFFILL ,2,RANDOM(24)
    NEXT z%
    PBOX 80,30,570,128 
    PBOX 80,282,570,377 
RETURN
'
PROCEDURE set_m(xm%,ym%)        !Mauszeiger setzen
    hand%=DPEEK(CONTRL+12)
    DPOKE CONTRL+2,0 
    DPOKE CONTRL+6,2 
    DPOKE CONTRL+12,hand%
    DPOKE INTIN,1 
    DPOKE INTIN+2,2 
    VDISYS 33 
    DPOKE PTSIN,xm%
    DPOKE PTSIN+2,ym%
    DPOKE CONTRL+2,1 
    DPOKE CONTRL+6,0 
    DPOKE CONTRL+12,hand%
    VDISYS 28 
RETURN

Hans-H.Ackermann
Aus: ST-Computer 05 / 1990, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite