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 : Amiga E - sélection d'un écran
(Article écrit par Pierre Girard et extrait d'Amiga News - avril 1996)
|
|
Ce mois-ci, un petit programme qui n'a pas beaucoup d'ambition mais qui va nous permettre d'aborder deux points importants :
l'utilisation de la structure intuitionbase et le maniement d'un des outils fournis avec le E.
Je m'occuperai désormais seul de cette rubrique d'Amiga News. Yann ayant de nombreuses autres activités, il n'a plus le temps
de s'en occuper (pour l'instant).
Le programme de ce mois-ci, que nous baptiserons SelectScreen, permet, vous l'avez deviné, d'amener au premier plan un écran par
un simple clic de la souris. Il se présente sous une forme très simple. Quand on lance le programme, une fenêtre s'ouvre et
plusieurs gadgets s'affichent (à condition bien sûr que plusieurs écrans soient ouverts) contenant chacun le nom de l'écran
disponible. Il suffit alors de cliquer sur l'un deux pour "sauter" à l'écran choisi.
La méthode
Pour construire l'interface graphique qui est très simple dans ce cas-là, j'ai utilisé le très pratique logiciel "GadToolsBox"
de Jan van den Baard, qui est un cadeaugiciel (alors, si vous l'utilisez, envoyez un cadeau à l'auteur). Une fois le fichier sauvé,
nous employons alors un outil fourni avec le E qui s'appelle SrcGen. La syntaxe est : "SrcGen nom_du_fichier" (sans le .gui).
Le résultat est un fichier source en E qui nous évite de nous tracasser avec la création des fenêtres, des boutons... Bien sûr,
il n'est pas question ici de détailler les fonctions de GadToolsBox ou de commenter le fichier source qu'il nous fournit (vous
n'avez qu'à expérimenter vous-même !).
Cependant, dans ce cas précis, il nous faut modifier la source car le nombre d'écrans ouverts peut changer et nous ne savons
donc pas combien il nous faut créer de boutons, ni quelle taille doit faire la fenêtre en hauteur. Le problème des gadgets
est vite réglé : nous faisons une boucle d'une longueur égale au nombre d'écrans et nous créons des gadgets dont seul décalage
y et le nom changent. Étant donné que le nom reste le même pour tous les boutons, leur détection se fera grâce à l'identificateur
(i). Quant à la taille de la fenêtre, elle est automatiquement modifiée en fonction du nombre d'écrans - nombre d'écrans x 13 + 13
(pour le premier bouton).
La recherche des écrans
Cette partie du programme est très simple (je sais, j'ai toujours tendance à dire que c'est très simple). Elle repose sur
l'utilisation de la structure intuitionbase. En E, l'adresse d'intuitionbase est facile à connaître car c'est une variable
système. Nous définissons "scre" qui pointe sur le premier écran (au premier plan). Nous définissons ensuite une boucle WHILE
qui dure tant qu'il y a des écrans ouverts (scre différent de 0). A l'intérieur de la boucle, nous stockons dans des tableaux
de LONG différents paramètres : l'adresse des écrans (screenadr[i]) et l'adresse de leur noms (nom[i]). Ensuite, il ne reste
plus qu'à appeler la procédure findnextscreen qui cherche le prochain écran dans la structure screen de l'écran d'avant-plan.
Ensuite, il suffit d'incrémenter la variable qui va nous servir à stocker le nombre d'écrans ouverts et notre variable de travail "i".
Conclusion
Le reste du programme a quasiment été entièrement créé par GadToolsBox (gestion des erreurs, procédure Main). Comme d'habitude,
ce programme n'est pas parfait (ce n'est pas la vocation de cette série d'articles de vous mâcher tout le travail !). Il
faudrait, par exemple, ajuster automatiquement la taille des gadgets et les centrer par rapport à la fenêtre. De même, le mieux
serait de faire de ce petit programme une commodité assignée à une touche (Alt-Tab, par exemple), et disponible à tout moment
sans relancer l'exécutable. Rendez-vous le mois prochain...
OPT OSVERSION=37
MODULE 'gadtools', 'libraries/gadtools', 'intuition/intuition',
'intuition/screens', 'intuition/gadgetclass', 'graphics/text',
'intuition/intuitionbase'
ENUM NONE, NOCONTEXT, NOGADGET, NOWB, NOVISUAL, OPENGT, NOWINDOW, NOMENUS
DEF selectscreenwnd:PTR TO window, selectscreenglist, infos:PTR TO gadget,
screenadr[10]:ARRAY OF LONG, scr:PTR TO screen, visual=NIL, offx, offy, tattr
PROC setupscreen()
IF (gadtoolsbase:=OpenLibrary('gadtools.library', 37))=NIL THEN RETURN OPENGT
IF (scr:=LockPubScreen('Workbench'))=NIL THEN RETURN NOWB
IF (visual:=GetVisualInfoA(scr, NIL))=NIL THEN RETURN NOVISUAL
offy:=scr.wbortop+Int(scr.rastport+58)-10
tattr:=['topaz.font', 8, 0, 0]:textattr
ENDPROC
PROC closedownscreen()
IF visual THEN FreeVisualInfo(visual)
IF scr THEN UnlockPubScreen(NIL, scr)
IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
ENDPROC
PROC openselectscreenwindow()
DEF numscreens=0, g:PTR TO gadget, nom[10]:ARRAY OF LONG, longueur[10]:ARRAY OF LONG,
scre:PTR TO screen, intbase:PTR TO intuitionbase, i=1
-> Recherche des écrans
intbase:=intuitionbase
scre:=intbase.firstscreen
WHILE scre<>0
screenadr[i]:=scre
nom[i]:=scre.title
scre:=findnextscreen(scre)
numscreens++
i++
ENDWHILE
IF (g:=CreateContext({selectscreenglist}))=NIL THEN RETURN NOCONTEXT
FOR i:=1 TO numscreens
IF (g:=CreateGadgetA(BUTTON_KIND, g, [offx+11, offy+(i*12), 600, 10, nom[i],
tattr, i, 0, visual, 0]:newgadget, [NIL]))=NIL THEN RETURN NOGADGET
ENDFOR
IF (selectscreenwnd:=OpenWindowTagList(NIL, [WA_LEFT, 0, WA_TOP, 15, WA_WIDTH,
offx+630, WA_HEIGHT, offy+(numscreens*13+13), WA_IDCMP, $24C077E, WA_FLAGS,
$100F, WA_TITLE, 'Choisissez un écran', WA_CUSTOMSCREEN, scr, WA_MINWIDTH, 200,
WA_MINHEIGHT, 50, WA_MAXWIDTH, $280, WA_MAXHEIGHT, 256, WA_AUTOADJUST, 1,
WA_AUTOADJUST, 1, WA_GADGETS, selectscreenglist, NIL]))=NIL THEN RETURN NOWINDOW
Gt_RefreshWindow(selectscreenwnd, NIL)
ENDPROC
PROC findnextscreen(sc:PTR TO screen)
sc:=sc.nextscreen
ENDPROC sc
PROC closeselectscreenwindow()
IF selectscreenwnd THEN CloseWindow(selectscreenwnd)
IF selectscreenglist THEN FreeGadgets(selectscreenglist)
ENDPROC
PROC wait4message(win:PTR TO window)
DEF mes:PTR TO intuimessage, type
REPEAT
type:=0
IF mes:=Gt_GetIMsg(win.userport)
type:=mes.class
IF (type=IDCMP_GADGETDOWN) OR (type=IDCMP_GADGETUP)
infos:=mes.iaddress
infos:=infos.gadgetid
ScreenToFront(screenadr[infos])
ELSEIF type=IDCMP_REFRESHWINDOW
Gt_BeginRefresh(win)
Gt_EndRefresh(win, TRUE)
type:=0
ELSEIF type<>IDCMP_CLOSEWINDOW
type:=0
ENDIF
Gt_ReplyIMsg(mes)
ELSE
WaitPort(win.userport)
ENDIF
UNTIL type
ENDPROC type
PROC reporterr(er)
DEF erlist:PTR TO LONG
IF er
erlist:=['get context', 'create gadget', 'lock wb', 'get visual infos',
'open "gadtools.library" v37+', 'open window', 'create menus']
EasyRequestArgs(0, [20, 0, 0, 'Could not s!', 'ok'], 0, [erlist[er-1]])
ENDIF
ENDPROC er
PROC main()
IF reporterr(setupscreen())=0
reporterr(openselectscreenwindow())
wait4message(selectscreenwnd)
closeselectscreenwindow()
ENDIF
closedownscreen()
ENDPROC
|
|