Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : E - Mousemove et Painter (ajout d'un gadget)
(Article écrit par Olivier Adam - novembre 1998)
|
|
L'enfer du E. The Jumpin'Windows
Je me suis dit que vous aviez compris le coup des modules, mais je n'ai pas pu résister
à l'envie de vous faire un gadget. Il n'est nécessaire que de corriger une ligne du
painter_plugin puis de recompiler ce module et enfin de compiler Painter à son tour pour
obtenir un joli gadget, dont l'intérêt est double :
- D'une part, le noyau du programme est devenu multifenêtres !
- D'autre part, c'est bien la première fois que je vois une fenêtre (Window, en anglais) qui en poursuit une autre !
La modification du module est la suivante (un bogue ?) :
Remplacer "CON_RESIZEX" par "RESIZEX", idem pour le "Y". Les commentaires du source de Painter
ont été modifiés, ne laissant apparaître que les nouveaux. Des bogues ont été retirés,
le jeu est donc de les identifier et de me faire parvenir la liste de ceux qui ont été ajoutés
(le bogue n'est pas un monopole de µ-Soft, mais l'incompétence est protégée sous cette
marque par le dépôt d'un brevet dans la plupart des pays).
Pour sauter à droite de notre fenêtre de Painter, la palette, si elle existe, utilise le signal
du mousemove lorsque Painter est actif, en déduit la position de la planche à dessiner et
bouge jusqu'à 5 pixels à droite de celle-ci. L'exécutable ne mesurant que 29 ko, on peut, je
pense, compiler le projet avec la version démo du E.
N'oubliez pas que la version de EasyGui est la 3.3b2, et vu que les sources sont fournies,
vous pouvez rajouter par exemple à ce module la détection des disquettes (DISK_INSERTED) qui
a été oubliée. Si vous recevez ce message, mangez-le !
Source "painter.e"
->©Adam98
OPT OSVERSION=37 -> blue-box : B1230-IV@50
OPT PREPROCESS
MODULE 'graphics/text',
'intuition/intuition',
'intuition/screens',
'tools/EasyGUI',
'tools/exceptions', -> gestion des erreurs
'*mousemove',
'*painter_plugin', -> retaillage modifié !
'*painter_rev'
-> globales
DEF f_prems:PTR TO guihandle,
f_deuzz:PTR TO guihandle,
plug:PTR TO painter
-> programme
PROC main() HANDLE
-> locales
DEF depth,
di:PTR TO drawinfo,
mh=NIL,
mouse:PTR TO mousemove,
s:PTR TO screen
s:=LockPubScreen(NIL)
di:=GetScreenDrawInfo(s)
depth:=di.depth
FreeScreenDrawInfo(s,di)
UnlockPubScreen(NIL,s)
-> l'interface multi-fenêtrée !
mh:=multiinit() ->initialisation de mh
-> première fenêtre
f_prems:=addmultiA(mh,VERSION_INFO,
NEW [EQROWS,
[PLUGIN,{m_a}, NEW mouse],
NEW [BEVEL,
[PAINTER,0,NEW plug]
]
],NIL)
plug.color:=1
-> deuxième fenêtre
f_deuzz:=addmultiA(mh,' ',
NEW [PALETTE,{p_a},NIL,depth,3,8,plug.color],
[EG_WTYPE,WTYPE_NOSIZE,
EG_CLOSE,{close},
EG_TOP,f_prems.wnd.topedge,
EG_LEFT,(5+f_prems.wnd.leftedge+f_prems.wnd.width),
NIL])
-> gestion des fenêtres très sommaire...
multiloop(mh)
EXCEPT DO
cleanmulti(mh) -> fait tout pour nous
report_exception() -> nous dit tout
ENDPROC
PROC close(mh:PTR TO multihandle,info) IS closewin(info)
PROC p_a(info,col)
plug.color:=col
ENDPROC
PROC m_a(info)
IF f_deuzz<>0 THEN
movewin(f_deuzz,(5+f_prems.wnd.leftedge+f_prems.wnd.width),f_prems.wnd.topedge)
ENDPROC
|
Source "Painter_rev.e"
-> Bumpee revision bump module. Do not alter this file manually.
OPT MODULE
OPT EXPORT
OPT PREPROCESS
/*
BUMP
NAME=painter
VERSION=1
REVISION=1
ENDBUMP
*/
CONST VERSION=1
CONST REVISION=1
CONST VERSION_DAY=31
CONST VERSION_MONTH=10
CONST VERSION_YEAR=98
#define VERSION_STRING {version_string}
#define VERSION_INFO {version_info}
PROC dummy() IS NIL
version_string: CHAR '$VER: '
version_info: CHAR 'painter 1.1 (31.10.98)',0
|
Source "Painter_plugin.e"
-> Example de plugin pour EasyGUI : Un Painter.
-> olivieradam@minitel.net (ASCII only !)
OPT MODULE ->ceci est un module
OPT OSVERSION=37 ->version minimum du système
->modules objets , CONSTANTES
MODULE 'graphics/text', ->textattr
'intuition/intuition', ->window,intuimessage
'intuition/screens', ->screen
'tools/EasyGUI' ->plugin , PLUGIN
-> notre objet : une surface pouvant être peinte
EXPORT OBJECT painter OF plugin
xm:INT, ->x souris
ym:INT, ->y souris
color:INT ->couleur choisie
ENDOBJECT
EXPORT CONST PAINTER=PLUGIN
-> Les méthodes par défaut :
PROC will_resize() OF painter IS RESIZEX OR RESIZEY
PROC min_size(ta:PTR TO textattr,fh) OF painter IS 100,100 ->taille de 100x100
PROC render(ta:PTR TO textattr,x,y,xs,ys,w:PTR TO window) OF painter IS self.draw(w,0)
PROC message_test(imsg:PTR TO intuimessage,w:PTR TO window) OF painter
-> test automatique de l'interface
DEF x,y
IF (imsg.class=IDCMP_MOUSEBUTTONS) OR (imsg.code=SELECTUP) -> si on a cliqué alors :
x:=imsg.mousex
y:=imsg.mousey
IF (x>=self.x) AND (y>=self.y) AND (x<(self.x+self.xs)) AND (y<(self.y+self.ys))
-> et si en plus on a cliqué dans la fenêtre alors :
self.xm:=x-self.x*1000/self.xs -> changement d'échelle
self.ym:=y-self.y*1000/self.ys
RETURN TRUE -> retourne vrai => provoque message_action()
ENDIF
ENDIF
ENDPROC FALSE -> retourne faux => pas de message_action()
-> ici on peut extraire les touches appuyées aussi ex: Amiga
Alt Ctrl Help...
PROC message_action(class,qual,code,w:PTR TO window) OF painter
self.draw(w,0) ->dessine l'outil 0 où l'on a cliqué
ENDPROC FALSE
-> méthode perso de dessin
PROC draw(w:PTR TO window,pad) OF painter -> le pad est là pour permettre d'ajouter des outils
DEF xm,ym
SELECT pad
CASE 0
xm:=self.xm*self.xs/1000+self.x -> rechangement d'échelle
ym:=self.ym*self.ys/1000+self.y
SetStdRast(w.rport) -> des fois que...
-> ma petite brosse
Line(xm-1,ym,xm+1,ym,self.color)
Line(xm,ym+1,xm,ym-1,self.color)
Plot(self.xm+self.x,self.ym+self.y,self.color)
-> CASE 1 -> autre outil, par exemple : ligne, rond, rectangle...
DEFAULT ; NOP -> outil par défaut, pour ne rien oublier
ENDSELECT
ENDPROC
|
Source "mousemove.e"
-> mousemove-plugin
OPT OSVERSION=37
OPT EXPORT
MODULE 'tools/EasyGUI',
'intuition/intuition'
OBJECT mousemove OF plugin
mx,old_mx
my,old_my
ENDOBJECT
PROC min_size(ta,fh) OF mousemove IS 0,0
PROC will_resize() OF mousemove IS FALSE
PROC render(ta,x,y,xs,ys,w:PTR TO window) OF mousemove IS EMPTY
PROC message_test(imsg:PTR TO intuimessage,w:PTR TO window) OF mousemove
self.mx:=imsg.mousex
self.my:=imsg.mousey
self.old_mx:=self.mx
self.old_my:=self.my
ENDPROC imsg.class=IDCMP_INTUITICKS
PROC message_action(class,qual,code,win) OF mousemove IS TRUE
|
[Télécharger les sources et les exécutables de cet article]
|