Obligement - L'Amiga au maximum

Vendredi 21 juillet 2017 - 08:42  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


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 giftware (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 l'offset 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


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]