FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Structure pour un programme Windows 4/4 Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
Structure pour un programme Windows 4/4 Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Structure pour un programme Windows 4/4 Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Structure pour un programme Windows 4/4 Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Structure pour un programme Windows 4/4 Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Structure pour un programme Windows 4/4 Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Structure pour un programme Windows 4/4 Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Structure pour un programme Windows 4/4 Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Structure pour un programme Windows 4/4 Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Structure pour un programme Windows 4/4 Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Structure pour un programme Windows 4/4 Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Structure pour un programme Windows 4/4 Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Structure pour un programme Windows 4/4 Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Structure pour un programme Windows 4/4 Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Structure pour un programme Windows 4/4 Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -20%
Drone Dji DJI Mini 4K (EU)
Voir le deal
239 €

 

 Structure pour un programme Windows 4/4

Aller en bas 
AuteurMessage
Jack
Admin
Jack


Nombre de messages : 2394
Date d'inscription : 28/05/2007

Structure pour un programme Windows 4/4 Empty
MessageSujet: Structure pour un programme Windows 4/4   Structure pour un programme Windows 4/4 EmptyJeu 24 Mar 2011 - 17:15

Ce tutoriel a été écrit par Klaus.

Structure pour un programme Windows
Leçon 4


Dans cette leçon, nous allons reprendre le programme réalisé dans la leçon précédente (3/4) et le faire évoluer. Nous allons voir comment on peut créer des séparations visuelles sur des régions de la fenêtre, comment on peut jouer avec les couleurs et les polices pour avoir une présentation plus personnalisée, et comment on peut réaliser des graphiques.

Nous allons procéder étape par étape, avec des explications détaillées à chaque niveau, et un code source Panoramic évoluant en conséquence, jusqu'au programme complet.

Pour mémoire, voici le programme réalisé dans la léçon précédente (3/4). Il permettait de saisir un mot, et le clic sur un bouton affichait le nombre de lettres contenues dans ce mot. On a aussi une liste des mots analysés qui peut être triée en ordre ascendant ou descendant, et elle peut être effacée.
Code:

                  ' Tutoriel sur la structure pour un programme Windows

' tous les labels du programme
label analyser_mot        : ' déclarer la routine événement:
label trier_liste          : ' déclencher le tri des mots traités
label effacer_liste        : ' effacer la liste des mots traités
label saisie_mot          : ' saisie du mot en cours
label sortir              : ' sortir du programme
label inverser_sens        : ' inverser le sens du tri
label a_propos            : ' montrer la fenêtre A-propos
label cacher_a_propos      : ' cacher la fenêtre a_propos

' toutes les variables du programme
dim longueur%, mot_a_analyser$, i%
dim nom_programme$, auteur$, date_creation$, version_programme$

' toutes les initialisations

nom_programme$ = "Tutoriel leçon 4"
auteur$ = "Klaus"
date_creation$ = "21 mars 2011"
version_programme$ = "V01.00"

' champ de saisie
edit 10                    : ' champ de saisie
top 10,20 : left 10,120    : ' position du coin en haut à gauche du champ dans la fenêtre
on_change 10,saisie_mot    : ' placé après la création de l'objet 30 pour informer Panoramic

' affichage du nombre de caractères
alpha 20                  : ' zone d'affichage
top 20,80 : left 20,120    : ' position du coin en haut à gauche de la zone d'affichage dans la fenêtre
font_size 20,12            : ' pour avoir une taille lisible facilement

' libellés des champs affichés
alpha 1 : top 1,20 : left 1,10 : caption 1,"Mot à analyser:"
alpha 2 : top 2,80 : left 2,10 : caption 2,"Nombre de lettres:"

' bouton déclenchant l'analyse
button 30                  : ' bouton déclenchant l'analyse
top 30,50 : left 30,120    : ' position du coin en haut à gauche du bouton
caption 30,"Analyse"      : ' libellé du bouton
ON_CLICK 30,analyser_mot  : ' placé après la création de l'objet 30 pour informer Panoramic

' liste d'affichage des mots traités
list 40                    : ' zone d'affichage
top 40,10 : left 40,300    : ' position du coin en haut à gauche de la liste

' détermination de la direction du tri
option 50                  : ' option pour tri ascendant
top 50,10 : left 50,450    : ' placement à l'écran
caption 50,"Tri ascendant"
option 51                  : ' option pour tri ascendant
top 51,30  : left 51,450  : ' placement à l'écran
caption 51,"Tri descendant"
MARK_ON 50                : ' cocher l'option tri ascendant par défaut

' bouton déclenchant le tri
button 60                  : ' bouton déclenchant l'analyse
top 60,50 : left 60,450    : ' position du coin en haut à gauche du bouton
caption 60,"Tri"          : ' libellé du bouton
ON_CLICK 60,trier_liste    : ' placé après la création de l'objet 60 pour informer Panoramic
inactive 60                : ' bouton inactif par défaut

' bouton effaçant la liste
button 70                  : ' bouton déclenchant l'analyse
top 70,80 : left 70,450    : ' position du coin en haut à gauche du bouton
caption 70,"Effacer"      : ' libellé du bouton
ON_CLICK 70,effacer_liste  : ' placé après la création de l'objet 70 pour informer Panoramic
inactive 70                : ' bouton inactif par défaut

' liste invisible pour le tri descendant
dlist 80                  : ' liste invisible

' menu système
main_menu 100              : ' racine du menu
' définir les sous-menus
sub_menu 101 : parent 101,100 : caption 101,"Fichiers"
sub_menu 102 : parent 102,100 : caption 102,"Fonctions"
sub_menu 103 : parent 103,100 : caption 103,"A-Propos"
on_click 103,a_propos

' sous-menu Fichiers
sub_menu 104 : parent 104,101 : caption 104,"Sortie"
on_click 104,sortir

' sous-menu Fonctions
sub_menu 105 : parent 105,102 : caption 105,"Analyser mot"
on_click 105,analyser_mot
sub_menu 106 : parent 106,102 : caption 106,"  Tri descendant"
on_click 106,inverser_sens
sub_menu 107 : parent 107,102 : caption 107,"Trier liste"
on_click 107,trier_liste
sub_menu 108 : parent 108,102 : caption 108,"Effacer liste"
on_click 108,effacer_liste

form 200                  : ' créer une fenêtre
hide 200                  : ' et la cacher tout de suite
top 200,300 : left 200,300
width 200,400 : height 200,200
caption 200,"A-propos"
' border_hide 200            : ' supprimer le bord et les boutons système
button 210                : ' créer le bouton de fermeture
parent 210,200            : ' il appartient à la fenêtre 200 !
top 210,140 : left 210,180 : ' positionner ce bouton dans la fenêtre
caption 210,"Fermer"
on_click 210,cacher_a_propos

' afficher les informations fixes
alpha 211 : parent 211,200
top 211,10 : left 211,10 : caption 211,"Programme  : "+nom_programme$
alpha 212 : parent 212,200
top 212,30 : left 212,10 : caption 212,"Auteur          : "+auteur$
alpha 213 : parent 213,200
top 213,50 : left 213,10 : caption 213,"Créé le        : "+date_creation$
alpha 214 : parent 214,200
top 214,70 : left 214,10 : caption 214,"Version        : "+version_programme$

end

' traitement des événements
analyser_mot:
mot_a_analyser$ = text$(10)  : ' récupérer le mot saisi
' et afficher le résultat dans l'objet 20
longueur% = len(mot_a_analyser$)
caption 20,"Ce mot a "+str$(longueur%)+" lettres."
text 10,""                : ' effacer le champ de saisie
if mot_a_analyser$<>""
    item_add 40,mot_a_analyser$  : ' ajouter le mot traité à la liste
    active 60                  : ' bouton actif
    active 70                  : ' bouton actif
end_if
set_focus 10              : ' placer le curseur dans le champ de saisie
return

trier_liste:
if checked(50)=1          : ' tri ascendant choisi ?
    SORT 40                    : ' alors trier normalement
else                      : ' ici, tri descendant choisi !
    clear 80                  : ' effacer la DLIST par précaution
    for i%=1 to count(40)      : ' boucler sur le contenu de la liste
        item_add 80,item_read$(40,i%)    : ' et copier chaque élément
    next i%
    sort 80
    clear 40                  : ' effacer notre liste
    for i%=count(80) to 1 step -1      : ' boucler sur le contenu de la DLIST
        item_add 40,item_read$(80,i%)    : ' et copier chaque élément
    next i%
end_if
return

effacer_liste:
clear 40                  : ' effacer la liste
inactive 60                : ' bouton inactif
inactive 70                : ' bouton inactif
return

saisie_mot:
' activation conditonnelle des boutons
if text$(10)=""
    active 60
    active 70
else
    inactive 60
    inactive 70
end_if
return

sortir:
terminate                  : ' arrêt immédiat du programme
return                    : ' on n'arrive jamais ici - présent juste pour la forme

inverser_sens:
text 10,""                : ' effacer le champ de saisie
if checked(50)=1          : ' actuellement en mode ascendant ?
    mark_on 51            : ' oui, alors passer en mode descendant
    caption 106,"* Tri descendant"
else                      : ' non
    mark_on 50            : ' alors passer en mode ascendant
    caption 106,"  Tri descendant"
end_if
return

a_propos:
show 200                  : ' montrer la fenêtre A-propos
inactive 0                : ' bloquer la fenêtre principale
return

cacher_a_propos:
hide 200                  : ' cacher le fenêtre A-propos
active 0                  : ' et réactiver la fenêtre principale
to_foreground 0            : ' replacer la fenêtre principale en avant-plan
return

Tout d'abord, nous allons créer 3 zones visuellement distinctes, dans notre fenêtre. Nous allons diviser la fenêtre en 3 zones: une première zone en haut à gauche contenant la zone de saisie et le bouton "Analyser", une seconde zone en haut à droite contenant la liste des mots analysés et les objets associés à cette liste, et une troisième zone en bas contenant le reste de la fenêtre dans laquelle nous allons faire des graphiques.

L'objet CONTAINER de Panoramic nous donne un moyen simple de créer ces zonages. Un container est un objet qui dans beaucoup d'aspects ressemble à une fenêtre. Il peut contenir d'autres objets, tout comme une fenêtre, dispose d'une bordure et d'un titre affichable. Pour affecter des objets à un container, on utilise toujours la même commande PARENT.

Il faut bien sûr créer l'objet container avant de lui affecter les objets qu'il devra contenir. Nous allons donc placer la création de nos trois containers juste avant la création des objets de notre programme.

Le premier container sera créé ainsi, en utilisant la commande CAPTION pour lui donner un libellé:
Code:

container 310              : ' pour le champ de saisie et le bouton "Analyser"
top 310,0 : left 310,0    : ' positionnement (ce sont les valeurs par défaut)
width 310,280 : height 310,130
caption 310,"Saisie"

Maintenant, il faut attacher les objets correspondants à ce container. Ceci est fait par les commandes PARENT, placées après la création de ces objets:
Code:

' attacher ces objets au container 310
parent 10,310
parent 20,310
parent 1,310
parent 2,310
parent 30,310

Ce n'est pas facilement visible sur ce premier container, mais le positionnement des objets placés dans ce container est adapté automatiquement au coin en haut à gauche du container, et non plus par rapport par rapport à la fenêtre. Nous n'avons donc pas besoin de revoir le positionnement des champs.

Maintenant, nous allons passer au second container. Il sera créé de la même manière:
Code:

' container en haut à droite
container 320              : ' pour le champ de saisie et le bouton "Analyser"
top 320,5 : left 320,285  : ' positionnement
width 320,280 : height 320,130
caption 320,"Historique"

Nous allons attacher les objets à ce container:
Code:

' attacher les objets au container 320
parent 40,320
parent 50,320
parent 51,320
parent 60,320
parent 70,320

Oups ! Les objets ont disparus ! Pourquoi ? A cause du positionnement relatif par rapport au coin en haut à gauche du container et non plus par rapport au coin en haut à gauche de la fenêtre ! Donc, il faut décaler ces champs de 285 pixels vers la gauche. Pour plus de clarté, nous allons écrire cela de la manière suivante:
Code:

top 40,10 : left 40,300-285    : ' position du coin en haut à gauche de la liste
et ainsi de suite pour les autres objets. Et maintenant, nos objets sont à nouveau visibles !

Le troisième container sera également créé de façon identique:
Code:

' container en bas
container 330              : ' pour les graphiques
top 330,135 : left 330,5  : ' positionnement
width 330,560 : height 330,280
caption 330,"Graphiques"

Nous allons remplir ce container un peu plus tard. Pour le moment, nous allons améliorer la présentation en modifiant polices et couleurs.

L'affichage du résultat se fait dans un objet ALPHA 20, dont nous avons passé la taille des caractères à 12 points. Nous allons choisir une police, passer les caractères en gras et italique et utiliser la couleur bleu foncé. Ces options seront mises en place dès la création de l'objet, mais rien n'empêche de le faire dynamiquement, à n'importe quel moment du programme:
Code:

' personnaliser l'affichage
font_name 20,"Roman"      : ' choix de la police
font_bold 20              : ' caractères gras
font_italic 20            : ' en italique
font_color 20,0,0,255      : ' bleu foncé

Comme le bouton d'effacement de la liste des mots traités a une action irréversible, nous allons faire deux choses: d'une part, nous allons passer son libellé en caractères gras, et d'autre part, nous allons demander une confirmation de l'effacement. Cette confirmation peut être obtenue par la fonction MESSAGE_CONFIRMATION_YES_NO(). Contrairement à une commande, cette fonction retourne une valeur. Elle affiche une fenêtre avec une question et deux boutons: Yes et No. Et elle retourne la valeur 1 si l'utilisateur a cliqué sur le bouton Yes, 0 si l'on a fermé la fenêtre par la croixc rouge et 2 si l'on a cliqué le bouton No. Donc, après la création du bouton "Effacer", nous allons ajouter:
Code:

' personnaliser ce bouton
font_bold 70              : ' caractères gras

et dans la routine événement "Effacer", nous allons insérer la ligne suivante, juste après le label:
Code:

if message_confirmation_yes_no("Voulez-vous vraiment effacer la liste ?")<>1 then return

Nous obtenons ainsi le programme suivant:
Code:

                  ' Tutoriel sur la structure pour un programme Windows

' tous les labels du programme
label analyser_mot        : ' déclarer la routine événement:
label trier_liste          : ' déclencher le tri des mots traités
label effacer_liste        : ' effacer la liste des mots traités
label saisie_mot          : ' saisie du mot en cours
label sortir              : ' sortir du programme
label inverser_sens        : ' inverser le sens du tri
label a_propos            : ' montrer la fenêtre A-propos
label cacher_a_propos      : ' cacher la fenêtre A_propos

' toutes les variables du programme
dim longueur%, mot_a_analyser$, i%
dim nom_programme$, auteur$, date_creation$, version_programme$

' toutes les initialisations

nom_programme$ = "Tutoriel leçon 4"
auteur$ = "Klaus"
date_creation$ = "21 mars 2011"
version_programme$ = "V01.00"

' container en haut à gauche
container 310              : ' pour le champ de saisie et le bouton "Analyser"
top 310,5 : left 310,5    : ' positionnement
width 310,280 : height 310,130
caption 310,"Saisie"

' container en haut à droite
container 320              : ' pour la liste
top 320,5 : left 320,285  : ' positionnement
width 320,280 : height 320,130
caption 320,"Historique"

' container en bas
container 330              : ' pour les graphiques
top 330,135 : left 330,5  : ' positionnement
width 330,560 : height 330,280
caption 330,"Graphiques"

' champ de saisie
edit 10                    : ' champ de saisie
top 10,20 : left 10,120    : ' position du coin en haut à gauche du champ dans la fenêtre
on_change 10,saisie_mot    : ' placé après la création de l'objet 30 pour informer Panoramic

' affichage du nombre de caractères
alpha 20                  : ' zone d'affichage
top 20,80 : left 20,120    : ' position du coin en haut à gauche de la zone d'affichage dans la fenêtre
font_size 20,12            : ' pour avoir une taille lisible facilement
' personnaliser l'affichage
font_name 20,"Roman"      : ' choix de la police
font_bold 20              : ' caractères gras
font_italic 20            : ' en italique
font_color 20,0,0,255      : ' bleu foncé

' libellés des champs affichés
alpha 1 : top 1,20 : left 1,10 : caption 1,"Mot à analyser:"
alpha 2 : top 2,80 : left 2,10 : caption 2,"Nombre de lettres:"

' bouton déclenchant l'analyse
button 30                  : ' bouton déclenchant l'analyse
top 30,50 : left 30,120    : ' position du coin en haut à gauche du bouton
caption 30,"Analyse"      : ' libellé du bouton
ON_CLICK 30,analyser_mot  : ' placé après la création de l'objet 30 pour informer Panoramic

' attacher ces objets au container 310
parent 10,310
parent 20,310
parent 1,310
parent 2,310
parent 30,310

' liste d'affichage des mots traités
list 40                    : ' zone d'affichage
top 40,20 : left 40,300-285    : ' position du coin en haut à gauche de la liste

' détermination de la direction du tri
option 50                  : ' option pour tri ascendant
top 50,10 : left 50,450-285    : ' placement à l'écran
caption 50,"Tri ascendant"
option 51                  : ' option pour tri ascendant
top 51,30  : left 51,450-285  : ' placement à l'écran
caption 51,"Tri descendant"
MARK_ON 50                : ' cocher l'option tri ascendant par défaut

' bouton déclenchant le tri
button 60                  : ' bouton déclenchant l'analyse
top 60,50 : left 60,450-285    : ' position du coin en haut à gauche du bouton
caption 60,"Tri"          : ' libellé du bouton
ON_CLICK 60,trier_liste    : ' placé après la création de l'objet 60 pour informer Panoramic
inactive 60                : ' bouton inactif par défaut

' bouton effaçant la liste
button 70                  : ' bouton déclenchant l'analyse
top 70,80 : left 70,450-285    : ' position du coin en haut à gauche du bouton
caption 70,"Effacer"      : ' libellé du bouton
ON_CLICK 70,effacer_liste  : ' placé après la création de l'objet 70 pour informer Panoramic
inactive 70                : ' bouton inactif par défaut
' personnaliser ce bouton
font_bold 70              : ' caractères gras

' attacher les objets au container 320
parent 40,320
parent 50,320
parent 51,320
parent 60,320
parent 70,320


' liste invisible pour le tri descendant
dlist 80                  : ' liste invisible

' menu système
main_menu 100              : ' racine du menu
' définir les sous-menus
sub_menu 101 : parent 101,100 : caption 101,"Fichiers"
sub_menu 102 : parent 102,100 : caption 102,"Fonctions"
sub_menu 103 : parent 103,100 : caption 103,"A-Propos"
on_click 103,a_propos

' sous-menu Fichiers
sub_menu 104 : parent 104,101 : caption 104,"Sortie"
on_click 104,sortir

' sous-menu Fonctions
sub_menu 105 : parent 105,102 : caption 105,"Analyser mot"
on_click 105,analyser_mot
sub_menu 106 : parent 106,102 : caption 106,"  Tri descendant"
on_click 106,inverser_sens
sub_menu 107 : parent 107,102 : caption 107,"Trier liste"
on_click 107,trier_liste
sub_menu 108 : parent 108,102 : caption 108,"Effacer liste"
on_click 108,effacer_liste

form 200                  : ' créer une fenêtre
hide 200                  : ' et la cacher tout de suite
top 200,300 : left 200,300
width 200,400 : height 200,200
caption 200,"A-propos"
' border_hide 200            : ' supprimer le bord et les boutons système
button 210                : ' créer le bouton de fermeture
parent 210,200            : ' il appartient à la fenêtre 200 !
top 210,140 : left 210,180 : ' positionner ce bouton dans la fenêtre
caption 210,"Fermer"
on_click 210,cacher_a_propos

' afficher les informations fixes
alpha 211 : parent 211,200
top 211,10 : left 211,10 : caption 211,"Programme  : "+nom_programme$
alpha 212 : parent 212,200
top 212,30 : left 212,10 : caption 212,"Auteur          : "+auteur$
alpha 213 : parent 213,200
top 213,50 : left 213,10 : caption 213,"Créé le        : "+date_creation$
alpha 214 : parent 214,200
top 214,70 : left 214,10 : caption 214,"Version        : "+version_programme$

end

' traitement des événements
analyser_mot:
mot_a_analyser$ = text$(10)  : ' récupérer le mot saisi
' et afficher le résultat dans l'objet 20
longueur% = len(mot_a_analyser$)
caption 20,"Ce mot a "+str$(longueur%)+" lettres."
text 10,""                : ' effacer le champ de saisie
if mot_a_analyser$<>""
    item_add 40,mot_a_analyser$  : ' ajouter le mot traité à la liste
    active 60                  : ' bouton actif
    active 70                  : ' bouton actif
end_if
set_focus 10              : ' placer le curseur dans le champ de saisie
return

trier_liste:
if checked(50)=1          : ' tri ascendant choisi ?
    SORT 40                    : ' alors trier normalement
else                      : ' ici, tri descendant choisi !
    clear 80                  : ' effacer la DLIST par précaution
    for i%=1 to count(40)      : ' boucler sur le contenu de la liste
        item_add 80,item_read$(40,i%)    : ' et copier chaque élément
    next i%
    sort 80
    clear 40                  : ' effacer notre liste
    for i%=count(80) to 1 step -1      : ' boucler sur le contenu de la DLIST
        item_add 40,item_read$(80,i%)    : ' et copier chaque élément
    next i%
end_if
return

effacer_liste:
if message_confirmation_yes_no("Voulez-vous vraiment effacer la liste ?")<>1 then return
clear 40                  : ' effacer la liste
inactive 60                : ' bouton inactif
inactive 70                : ' bouton inactif
return

saisie_mot:
' activation conditonnelle des boutons
if text$(10)=""
    active 60
    active 70
else
    inactive 60
    inactive 70
end_if
return

sortir:
terminate                  : ' arrêt immédiat du programme
return                    : ' on n'arrive jamais ici - présent juste pour la forme

inverser_sens:
text 10,""                : ' effacer le champ de saisie
if checked(50)=1          : ' actuellement en mode ascendant ?
    mark_on 51            : ' oui, alors passer en mode descendant
    caption 106,"* Tri descendant"
else                      : ' non
    mark_on 50            : ' alors passer en mode ascendant
    caption 106,"  Tri descendant"
end_if
return

a_propos:
show 200                  : ' montrer la fenêtre A-propos
inactive 0                : ' bloquer la fenêtre principale
return

cacher_a_propos:
hide 200                  : ' cacher le fenêtre A-propos
active 0                  : ' et réactiver la fenêtre principale
to_foreground 0            : ' replacer la fenêtre principale en avant-plan
return

Passons maintenant aux graphismes. Panoramic peut gérer des graphiques de différentes manières. Ici, nous allons utiliser les grahiques en 2 dimensions, afin d'afficher une sorte d'histogramme de la longueur des mots analysés.

Les commandes graphiques commencent toutes par "2D_". Elles ciblent un objet spécial dans Panoramic, capable d'afficher le résultat de ces commandes. La form 0 est la cible par défaut. Mais ce n'est pas pratique, car si jamais nos graphismes sont recouverts par une autre fenêtre Windows, ils sont effacés lorsque la fenêtre recouvrante disparaît. Cela n'a donc qu'un intérêt limité. Heureusement, la cible peut aussi être un objet PICTURE qui n'a pas cet inconvéniant. De plus, comme n'importe quel autre objet, nous pouvons placer un picture n'importe où, et l'attacher à un container. C'est ce nous allons commencer par faire:
Code:

' pour recevoir les graphismes
picture 90                : ' picture pour les graphismes
parent 90,330              : ' attacher ce picture au container 30
top 90,15 : left 90,10    : ' positionnement dans le container
width 90,540 : height 90,260  : ' dimensions
color 90,230,230,100      : ' couleur de fond
2d_target_is 90            : ' toutes les commandes 2d_ iront dans picture 90

Nous allons maintenant afficher un rectangle de couleur pour chaque mot, en alternant la couleur bleue et rouge. La largeur du rectangle sera de 10 pixels. La hauteur dépendra du nombre de lettres du mot. Nous allons choisir une hauteur de 10 pixels pour chaque lettre, et limiter la hauteur à 250 pixels (25 lettres) si la longueur du mot dépasse 25 caractères. Il faut aussi se souvenir de la position horizontale d'affichage - nous allons utiliser une nouvelle variable x% pour cela. Dernière remarque: si le picture est plein, c'est-à-dire nous avons analysé 54 mots, il sera effacé et l'affichage recommence à gauche. Bien sûr, le bouton "Effacer" de la liste devra aussi effacer notre histogramme.

Commencons par la variable:
Code:

dim x%                    : ' position du prochain rectangle dans picture 90

Effacement du picture (cette ligne sera placée dans la routine "Effacer" et dans le code qui gèrera le cas de la 55ème lettre):
Code:

2d_clear 90                : ' effacer l'histogramme
color 90,230,230,100      : ' couleur de fond
x% = 0                    : ' replacer le pointeur à gauche du picture

Maintenant, nous allons créer une variable pour gérer la couleur du rectangle affichée. Les couleurs, comme nous l'avons vu précédemment, sont définies par des valeurs R, G et B (rouge, vert et bleu), variant chacune entre 0 (absence) et 255 (maximum). Ainsi, pour obtenir un rouge intense, on utilise (255,0,0), et pour un bleu intense, ce sera (0,0,255). Dans notre cas, la couleur verte sera toujours zéro, et bleu et rouge passent alternativement de 0 à 255 et vice versa. Ainsi, nous definirons une variable:
Code:

dim couleur%              : ' couleur pour les rectangles de l'histogramme

La valeur par défaut est 0 (zéro). Pour déterminer la couleur d'un rectangle, il suffit alors de faire:
Code:

2d_fill_color couleur%,0,255-couleur%
provoquant un rectangle bleu la première fois. Pour alterner la couleur, nous ajoutons une ligne:
Code:

couleur% = 255 - couleur%
et le prochain rectangle sera rouge, et ainsi de suite.

Encore un détail: les coordonnées des pixels dans un picture sont comptées à partir du coin en haut à gauche, en commençant à zéro. Or, nous voulons tracer notre histogramme de bas en haut, et de gauche à droite. Pour la coordonnée horizontale, il n'y a pas de problème: nous pouvons commencer à zéro, et additionner 10 à chaque rectangle. Mais pour la coordonnée verticale, nous devons commencer à 260 (hauteur du picture) pour atteindre la ligne de base, puis déduire 10 * nombre de lettres pour déterminer le sommet du rectangle. Les commandes utilisées seront 2D_RECTANGLE pour dessiner le rectangle, et 2D_FILL_COLOR pour déterminer notre couleur de remplissage. Le rectangle sera entouré d'une bordure noire d'une largeur de 1 pixel. La couleur de la bordure pourrait être changée par la commande 2D_PEN_COLOR, et sa largeur par la commande 2D_PEN_WIDTH.

Juste pour être complet, notons aussi qu'un objet picture peut bien sûr recevoir une image ou une photo (en format JPG ou BMP). Pour cela, il faut utiliser la commande FILE_LOAD.

Passons à la réalisation. Dans la routine "Analyser", nous ajouterons les commandes suivantes, juste avant le set_focus:
Code:

' tracer l'histogramme
if longueur%>25 then longueur% = 25    : ' limiter la hauteur du rectangle
if x%=540                      : ' est-ce que le picture est plein ?
    2d_clear                  : ' si oui: effacer et recommencer au début
    color 90,230,230,100
    x% = 0
end_if
2d_fill_color couleur%,0,255-couleur%      : ' forcer la couleur de remplissage
2d_rectangle x%,260,x%+9,260-longueur%*10  : ' tracer le rectangle
couleur% = 255 - couleur%                  : ' passer à la couleur alternée
x% = x% + 10                              : ' pointer au début du rectangle suivant


Récapitulons les éléments importants de ce tutoriel:
- structuration d'une fenêtre à l'aide des containers
- utilisation des polices, attributs graphiques et couleurs
- graphiques en 2 dimensions

Voilà, c'est le point final de cette série de tutoriels. Nous savons maintenant réaliser un programme Windows, en gérant les événements et les menus, avec une présentation conforme à ce que l'on voit couramment dans les programmes Windows.
Revenir en haut Aller en bas
https://panoramic.1fr1.net
 
Structure pour un programme Windows 4/4
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Structure pour un programme Windows 1/4
» Structure pour un programme Windows 2/4
» Structure pour un programme Windows 3/4
» Ma structure de programme pour débutant.
» Structure de données facile pour dll

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Tutoriels et éclaircissements-
Sauter vers: