← ST-Computer 05 / 1990

Radieren auf dem Bildschirm

Programmierpraxis

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