Atom Nieuws jaargang 1999 nummer 2 |
pagina 8 |
Atomic Windows
Voorbeeld programmeren in AW: Gevoelig plekje
Inleiding:
In de
reeks Voorbeeld programmeren in AW wordt iedere keer een
ander AW-commando besproken en toegelicht met een voorbeeld
programma. Het is nu de beurt aan een commando wat een gevoelige
plekje van Atomic Windows is, nl. het DLGHOTSPOT commando. Dit
commando is bedoeld om met de muis binnen een bepaald vlak een
positie aan te klikken waarvan de coordinaten teruggegeven worden.
Deze coordinaten zijn altijd vanaf de linkerbovenhoek van het
hotspot-vlak gezien, onafhankelijk van waar het hotspot-vlak
geplaatst is in het window.
Voorbeelden van dit commando zijn te
vinden in het icoon ontwerp- en het font ontwerp programma welke op
de AW-Utils schijf staan.
Doel:
Door middel
van dit voorbeeld wil ik demonstreren hoe eenvoudig het is om met
Atomic Windows een programma te maken waarmee bijvoorbeeld tekeningen
of delen van tekeningen op pixelnivo bewerkt kunnen worden.
Principe:
Het
programma werkt als volgt:
Als eerste worden er 16 strings van 16 karakters gedefinieerd. De gebruikte karakters zijn speciale Atomic Windows karakters (ASCII-code 0 t/m 31). In dit voorbeeld zijn ASCII-code 9 (een leeg vierkant) en ASCII-code 10 (een gevuld vierkant) gebruikt.
Vervolgens worden deze 16 strings onder elkaar op het scherm geplaatst.
Op het scherm wordt dmv het
DLGHOTSPOT commando een vlak gedefinieerd, gelijk aan de posities van
de strings, van 16 x 16 karakters. Wanneer men in een DLGHOTSPOT-vlak
een positie aanklikt, dan worden de X- en Y-coordinaat van die
positie opgeslagen in 2 variabelen welke in het commando gedefinieerd
zijn. De linkerbovenhoek is X=0 en Y=0. De Y-coordinaat geeft dus het
stringnummer aan en de X-coordinaat de positie binnen deze string.
Voorbeeld: ik klik in het DLGHOTSPOT-vlak positie 3,4 aan. Dit
betekent dat het 4e karakter in string 5 aangewezen wordt en in dit
voorbeeld van ASCII-code 9 een ASCII-code 10 of andersom gemaakt
wordt. (LET OP, men begint te tellen vanaf positie 0!!).
PROC INIT:
In array S worden 16 strings van 16
karakters gedefinieerd waarin elk karakter een leeg vakje met
kaderlijn is. Wanneer deze strings onder elkaar op het scherm
geplaatst worden, ontstaat er een kader met stippellijnenen.
PROC SCHERM:
Deze
procedure bouwt een scherm op met een kader waarin de 16 strings
onder elkaar geplaatst worden. Dit vak wordt dmv het DLGHOTSPOT tot
een gevoelig plekje gebombardeerd.
Hieronder staat een afdruk van het scherm:
HOOFDPROGRAMMA:
Als
eerste wordt alles geinitieerd en het scherm opgebouwd.
Daarna
begint de loop waarin men blijft totdat er op de Ok-knop gedrukt
wordt.
Wanneer er met de muis op een vakje in het hotspot-vlak
gedrukt wordt, dan wordt dit vakje verkleurd. Dwz als het wit is
wordt het zwart of andersom.
Hierbij is een truukje gebruikt om
van ASCII-code 9, ASCII-code 10 te maken of andersom. Decimaal 9 is
binair 1001 en decimaal 10 is binair 1010. Binair 1001 (9)
exclusief-OR 3 is binair 1010. Binair 1010 (10) exclusief-or 3 is
binair 1001 (9). We kunnen dus het karakter in de string
exclusief-OR-en met 3 om een wit vakje zwart, of een zwart vakje wit
te maken.
De listing van het programma staat hieronder:
10 PROGRAM
HOTSPOT
20
30 DIM
S(300) ; Init string ruimte
40
50 PROC INIT
60
CLEAR4
70 DLGCLS
80 DLGPO.0 ; Muispointer aan
90 DLGBA.#7000
100 F.I=0TO15 ;
Defineer 16 strings
110 F.J=0TO15S.4
; Elke string 16 x ASCII-code 9
120
!(S+I*17+J)=#09090909
130 N.
140 ?(S+I*17+J)=13
150 N.
160 PEND
170
180 PROC SCHERM
190
DLGCRE.A,"Hotspot",104,7,1,18,22; Plaats window
200 DLGFR."",0,1,3,16,16 ; Plaats frame
om vak
210 DLGHOT.100,1,3,16,16,X,Y
; Defineer hotspot-vak
220 F.I=0 TO
15 ; Plaats 16 strings
230
DLGLA.(S+I*17),0,1,(I+3)
240 N.
250 PEND
260
270 REM HOOFDPROGRAMMA
280 INIT
290 SCHERM
300
310 DLGEND
320
330 XIF A=100 THEN ;
Binnen hotspot gedrukt?
340
?(S+Y*17+X)=?(S+Y*17+X):3 ; Verkleur vakje
350 DLGLA.(S+Y*17),0,1,(Y+3) ; Plaats nieuwe string
360 ELSE
370
380 IF A<>0;G.310 ; Ok-knop gedrukt?
390
400 END
Zo, weer een artikel in de reeks 'Voorbeeld programmeren in AW'. De volgende keer weer meer. Tot schrijvens!!!
Kees van Oss