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