QUICK Ecke 26 von Harald Schönfeld So, heute geht es richtig in die Vollen. Ein kleines Malprogramm für GRAPHICS 8 ist angesagt. Und das auch noch mit Maussteuerung! Damit die Sache aber nicht zu kompliziert wird, verlagern wir einen Teil des Programms in eine Library. MAUS.LIB - DIE MAUSLIBRARY FÜR GRAFIK 8 Im letzten Teil habe ich ja schon erklärt, wie man die Maus auf einem Grafik 8- Bildschirm darstellen kann. Die Routinen INITARR und MOVEMAUS stammen aus der letzten Folge. Die MAUS.LIB enthält aber noch ein paar zusätzliche Routinen: .HIDEMAUS Schaltet den Mauszeiger ab. Diese Routine muß immer aufgerufen werden, bevor man im Programm etwas auf den Bildschirm zeichnet. Warum? Würde man das nicht tun, passiert folgendes: Man malt eine Linie, die über den Mauszeiger führt. Damit wäre dieser übermalt, was nicht so schlimm wäre, weil er beim Bewegen wieder korrekt gezeigt wird. Was schlimm ist. Sobald man ihn bewegt wird der ALTE Hintergrund an der Stelle des Mauszeigers eingesetzt. Die Linie wäre an dieser Stelle also wieder weg! .SHOWMAUS Diese Routine schaltet den Zeiger wieder ein. Dieses Konzept habe übrigens nicht ich mir ausgedacht, sondern auf dem ST (mit der Benutzeroberfläche GEM) geht das ganz genauso. .PRELL Wartet solange bis die Maustaste nicht mehr gedrückt ist. Die MAUS.LIB sieht dann so aus: D1:MAUS.LIB * MAUS-SYSTEM FUER GRAFIK 8 * fuer UserMag QUICK Ecke 26 * QUICK V2.1 * Standard Mouse Library for GRAPHICS 8 * (c) HYPERON SOFT 7/92 PROC INITARR LOCAL ARRAY (+ TMP(10) )+ WORD (+ ADR,CX )+ BYTE (+ I,B,CY MX=178,MY=179 )+ BEGIN DATA(TMP) (+ 128,192,224,240,248,252,48,48,24,24 )+ MX=0 MY=0 AEXMY=MY EXMX=MX AEXMX=EXMX SPEED=2 SUB(SAVMSC,400,MAUS) SUB(MAUS,50,SAVE) ADD(EXMX,5,CX) ADD(MY,9,CY) CUT(EXMX,MY,CX,CY,SAVE) ADR=SAVMSC I=0 REPEAT B=TMP(I) POKE(ADR,B) ADD(ADR,40,ADR) I+ UNTIL I=10 CUT(0,0,5,9,MAUS) PASTE(0,0,0,SAVE) ENDPROC PROC MOVEMAUS LOCAL BYTE (+ CY,I,TST MX=178,MY=179 AX )+ WORD (+ CX )+ BEGIN I=0 REPEAT MOUSE I+ UNTIL I=SPEED SUB(MX,AX,TST) IF TST=1 ADD(EXMX,1,EXMX) AND(EXMX,1,TST) IF TST=0 DIV(EXMX,2,MX) ENDIF ELSE IF TST=-1 SUB(EXMX,1,EXMX) AND(EXMX,1,TST) IF TST=0 DIV(EXMX,2,MX) ENDIF ELSE IF TST<>0 MULT(MX,2,EXMX) ENDIF ENDIF ENDIF IF MY>184 MY=184 ENDIF AX=MX ENDPROC PROC HIDEMAUS BEGIN PASTE(0,AEXMX,AEXMY,SAVE) ENDPROC PROC SHOWMAUS LOCAL BYTE (+ CY )+ WORD (+ CX )+ BEGIN ADD(EXMX,5,CX) ADD(EXMY,9,CY) CUT(EXMX,EXMY,CX,CY,SAVE) PASTE(1,EXMX,EXMY,MAUS) ENDPROC PROC PRELL BEGIN REPEAT UNTIL STRIG1=1 ENDPROC DAS RUMPFPROGRAMM Will man MAUS.LIB im eigenen Programm verwenden, so muß man mit INCLUDE (+ D:MAUS.LIB )+ die Library am Anfang des Programms dazuladen. Das Grundgerüst eines Programms, das die MAUS.LIB benutzten will, muß so aussehen: D1:MAUSBEG.QIK * MAUS-SYSTEM FUER GRAFIK 8 * (c) 1992 by H.Schoenfeld * fuer UserMag QUICK Ecke 26 * Rumpfprogramm fuer MAUS.LIB INCLUDE (+ D1:MAUS.LIB )+ * VARIABLEN FUERS EIGENE PROGRAMM * VARIABLEN FUERS MAUS-SYSTEM BYTE (+ SPEED EXMY=179,AEXMY STRIG1=645 )+ WORD (+ SAVMSC=88 EXMX,AEXMX MAUS,SAVE )+ MAIN CLOSE(6) OPEN(6,8,8,"S:") SETCOL(1,0,0) SETCOL(2,0,10) .INITARR .SHOWMAUS REPEAT .MOVEMAUS IF STRIG1=0 JUMP(1) ELSE IF AEXMX<>EXMX JUMP(1) ELSE IF AEXMY<>EXMY JUMP(1) ENDIF ENDIF ENDIF JUMP(2) -1 .HIDEMAUS * Hier kann man sofort auf den BS malen * da die Maus aus ist. .SHOWMAUS -2 AEXMY=EXMY AEXMX=EXMX * Will man hier malen, muss man * HIDE und SHOW selbst benutzen UNTIL 1=0 ENDMAIN Hier werden einige globale Variablen für die Library definiert. Das ist nicht so schön, aber es geht fast nicht anders. An den 2 bezeichneten Stellen kann man dann die eigenen Routinen in den Quellcode einfügen. Da bei der oberen Stelle der Mauszeiger gerade ausgeschaltet wurde, kann man hier auf den Schirm zeichnen OHNE HIDEMAUS zu benutzen. Bei der 2. Stelle ist das nicht mehr der Fall. Die Mausposition findet man in EXMX und EXMY. DAS GRAFIKPROGRAMM In dieses Rumpfprogramm werden nun ein paar Zeilen eingefügt, und schon ist ein ganz einfaches Zeichenprogramm fertig. Die auszuführende Funktion wird über Tastatur eingegeben. Dazu wird die Speicherstelle CH (=764) abgefragt. Leigt keine Taste vor, so steht dort 255. Wurde C (=18) gedrückt so wird der Bildschirm gelöscht. Dazu wird mit COLOR 125 auf den Bildschirm geplottet. G (=61) lädt ein Bild Names "D:ZUG.PIC" in den Bildschirm. Auch hier muß die Maus vorher abgeschaltet werden. p (=10) schaltet MOD auf Modus 2 um. Damit wird bei jedem Maustastendruck ein Punkt auf den Schirm geplottet. D (=58) setzt MOD auf 3. Nun kann man im Draw-Modus malen. Zu beginn wird ein Anfangspunkt gesetzt. Danach werden alle folgenden Punkte mit Linien verbunden, solange bis man die Maustaste wieder losläßt. L (=0) schaltet MOD auf 1. So kann man einzelnen Linien malen. Zunächst wird der Anfangspunkt gemerkt. Dann wird beim nächsten Tastendruck eine Linie zur aktuellen Mausposition gezogen. Nun, das sind natürlich nicht viele Funktionen, aber mit dem Grundkonzept ist es nun wirklich einfach auch andere Funktionen einzubauen. Wenn man die GRAPH.LIB benutzt, so sind Kreise, Rechtecke und sogar der Fillbefehl ganz simpel. Sollte jemand die MAUS.LIB für ein Programm benutzten wollen, das er verkaufen will, so sollte mir der Programmierer dies mitteilen! So, und hier der Quellcode zum Malprogramm: D1:QE26.QIK * MAUS-SYSTEM FUER GRAFIK 8 * (c) 1992 by H.Schoenfeld * fuer UserMag QUICK Ecke 26 INCLUDE (+ D1:MAUS.LIB )+ * VARIABLEN FUERS EIGENE PROGRAMM BYTE (+ CH=764 MOD,MODNR Y1,Y2 )+ WORD (+ X1,X2 )+ * VARIABLEN FUERS MAUS-SYSTEM BYTE (+ SPEED EXMY=179,AEXMY STRIG1=645 )+ WORD (+ SAVMSC=88 EXMX,AEXMX MAUS,SAVE )+ MAIN CLOSE(6) OPEN(6,8,8,"S:") SETCOL(1,0,0) SETCOL(2,0,10) MOD=0 MODNR=0 .INITARR .SHOWMAUS REPEAT .MOVEMAUS IF STRIG1=0 JUMP(1) ELSE IF AEXMX<>EXMX JUMP(1) ELSE IF AEXMY<>EXMY JUMP(1) ENDIF ENDIF ENDIF JUMP(2) -1 .HIDEMAUS * Hier kann man sofort auf den BS malen * da die Maus aus ist. * LINES IF MOD=1 IF MODNR=1 IF STRIG1=0 X2=EXMX Y2=EXMY COLOR(1) PLOT(X1,Y1) DRAW(X2,Y2) MODNR=0 .PRELL ENDIF ELSE IF STRIG1=0 X1=EXMX Y1=EXMY .PRELL MODNR=1 ENDIF ENDIF ENDIF * POINTS IF MOD=2 IF STRIG1=0 COLOR(1) PLOT(EXMX,EXMY) ENDIF ENDIF * DRAW IF MOD=3 IF MODNR=1 IF STRIG1=0 COLOR(1) DRAW(EXMX,EXMY) ELSE MODNR=0 ENDIF ELSE IF STRIG1=0 COLOR(1) PLOT(EXMX,EXMY) MODNR=1 ENDIF ENDIF ENDIF .SHOWMAUS -2 AEXMY=EXMY AEXMX=EXMX * Will man hier malen, muss man * HIDE und SHOW selbst benutzen * LOADPIC IF CH=61 .LOADZUG ENDIF * CLRPIC IF CH=18 .HIDEMAUS COLOR(125) PLOT(0,0) .SHOWMAUS ENDIF * LINEMOD IF CH=0 MOD=1 MODNR=0 ENDIF * POINTMOD IF CH=10 MOD=2 ENDIF * DRAWMOD IF CH=58 MOD=3 MODNR=0 ENDIF CH=255 UNTIL 1=0 ENDMAIN PROC LOADZUG BEGIN .HIDEMAUS OPEN(1,4,0,"D1:ZUG.PIC") BGET(1,7680,SAVMSC) CLOSE(1) .SHOWMAUS ENDPROC