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:
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.
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