C'est l'heure de coder
Vous vous sentez à l'aise ? Vous êtes en train de vous dire "Tiens, je vais commencer ce chapitre tranquillement..." ?
C'est loupé, c'est l'heure pour vous de travailler, je trouve que j'en ai assez fait à votre place !
Le principe de ce mini-TP est très simple, c'est une simple application du chapitre précédent ; mais je n'avais alors géré qu'une seule interface, vous allez devoir en gérer deux !
Et comme si cela ne suffisait pas, vous allez devoir vous débrouiller seul.
Que dois-je faire?
Vous devez créer 2 GUIs :
- La première comportera une boite à cocher (CheckBox) ainsi qu'un bouton pour afficher la GUI2.
- La seconde comportera un bouton radio (RadioBox) ainsi qu'un bouton pour afficher la GUI1.
Vous devez également gérer les événements liés à la fermeture des fenêtres, la CheckBox ainsi que la RadioBox par un message indiquant le contrôle cliqué.
Et tout ceci en moins de 50 lignes...
Au travail !
Indices et correction
Si vous lisez ceci, j'espère que c'est parce que vous avez terminé et que vous voulez voir si votre programme ressemble à ce que j'ai fait. Sinon vous pouvez revenir en arrière...
Si vous avez du mal, la seule chose qui change de tout à l'heure, c'est le GuiSetState(). Allez voir dans l'aide, tout est expliqué. Si vous ne comprenez toujours pas, jetez donc un coup d'œil sur la correction.
Secret (cliquez pour afficher)Code : Autre1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| #include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
; ########## Début de la création de la GUI 1 ##########
$GUI1 = GUICreate("GUI1", 250, 150, -1, -1) ; Création de la GUI1
$Lb1 = GUICtrlCreateLabel("Fenêtre 1", 85, 10, 120, 24) ; Création du label1
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") ; Mise en gras du texte du contrôle précédent (Label1)
$Chb1 = GUICtrlCreateCheckbox("Checkbox1", 90, 60, 100, 20) ; Création d'une CheckBox
$Btn1 = GUICtrlCreateButton("Masque la GUI1 et Affiche la GUI2", 35, 110, 180, 25) ; Création d'un bouton simple
; ########## Fin de la création de la GUI 1 ##########
; ########## Début de la création de la GUI 2 ##########
$GUI2 = GUICreate("GUI2", 250, 150, -1, -1) ; Création de la GUI2
$Lbl2 = GUICtrlCreateLabel("Fenêtre 2", 85, 10, 120, 24) ; Création du label2
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") ; Mise en gras du texte du contrôle précédent (Label2)
$Rd1 = GUICtrlCreateRadio("Radio1", 100, 60, 100, 20) ; Création d'un bouton radio
$Btn2 = GUICtrlCreateButton("Masque GUI 1 et Affiche GUI 2", 35, 110, 180, 25) ; Création d'un bouton simple
; ########## Fin de la création de la GUI 2 ##########
GUISetState(@SW_SHOW, $GUI1) ; On affiche la GUI1 (la GUI2 reste masquée)
While 1 ; Début de la boucle infinie
$nMsg = GUIGetMsg() ; Récupération des messages GUI
Switch $nMsg ; Début du sélecteur de cas
Case $GUI_EVENT_CLOSE ; Si clic fermeture fenêtre GUI1 ou GUI2 on sort
MsgBox(64, 'Info', 'Vous avez choisi de fermer la fenêtre en cours') ; Message
Exit ; Fin du script
Case $Btn1 ; Si clic sur le bouton $Btn1
GUISetState(@SW_HIDE, $GUI1) ; On masque la GUI 1
GUISetState(@SW_SHOW, $GUI2) ; On affiche la GUI 2
Case $Chb1 ; Si clic sur le contrôle $Chb1 (CheckBox)
MsgBox(64, 'Info', 'Vous avez cliqué sur la CheckBox') ; Message
Case $Btn2 ; Si clic sur le bouton $Btn2
GUISetState(@SW_HIDE, $GUI2) ; On masque la GUI 2
GUISetState(@SW_SHOW, $GUI1) ; On affiche la GUI 1
Case $Rd1 ; Si clic sur le contrôle $Rd1 (RadioBox)
MsgBox(64, 'Info', 'Vous avez cliqué sur la RadioBox') ; Message
EndSwitch ; Fin du sélecteur de cas
WEnd ; Fin de la boucle infinie |
Explications
Les 20 premières lignes de code permettent la création des différents éléments graphiques (fenêtres et contrôles).
L'identifiant de chaque objet graphique est stocké dans une variable au nom unique.
Juste après la création du label, on utilise une fonction qui permet de modifier la police et le style de certains contrôles. Ceci est facultatif.
Le nombre -1 est utilisé pour spécifier que nous souhaitons faire cette modification sur le contrôle qui a été créé juste avant cette commande.
Si vous utilisez cette commande à un autre endroit dans le script, vous devez utiliser la variable de l'identifiant de ce contrôle (dans l'exemple précédent, nous utiliserons $Chb1 pour la CheckBox1).
La ligne
GUISetState(@SW_SHOW, $GUI1) nous permet de spécifier l'affichage de la GUI1 (la GUI2 et ses objets graphiques existe malgré tout mais elle est n'est pas visible).
Ensuite, nous attaquons la boucle de lecture des événements graphiques (
While 1 / Wend). N'oubliez pas que cette boucle doit être permanente (infinie) sans quoi la GUI1 disparaitra dès que le reste du code aura été exécuté. Cette boucle permet donc d'exécuter le code qui se trouve à l'intérieur de celle-ci aussi longtemps que nous le souhaitons. Comme nous l'avons vu dans le chapitre sur les boucles,
While 1 permet justement de créer une boucle infinie.
La ligne
$nMsg = GUIGetMsg() va nous permettre de 'capturer' les événements graphiques dans une variable. En effet, chaque action sur la GUI ou un de ses objets renvoie un code et c'est ce code que nous voulons analyser afin de lancer l'action qui correspond.
La ligne
Switch $nMsg permet à AutoIt de 'commuter' ou 'sélectionner' l'un des cas possibles décrit dans les lignes qui suivent. Les cas sont tout simplement gérés par des commandes
Case successives.
Ici, chaque
Case doit correspondre à une valeur possible de la variable
$nMsg (c'est-à-dire à l'identifiant d'un des contrôles de nos GUIs).
Regardons les 5 cas présents dans l'exemple ci-dessus :
- Cas n°1 (Case $GUI_EVENT_CLOSE) - Ce cas, teste la variable $nMsg et la variable $GUI_EVENT_CLOSE (qui correspond à l'événement du clic sur la fermeture d'une fenêtre). Si les deux variables correspondent, alors le code qui se trouve en dessous jusqu'au prochain Case sera exécuté. En l'occurrence, c'est l'affichage d'une boite de dialogue puis la sortie du script.
- Cas n°2 (Case $Btn1) - Ici, le cas correspond au clic sur le bouton de la GUI1. Cela permet d'utiliser deux fois la commande GUISetState() qui nous permet de masquer la GUI1 puis d'afficher la GUI2.
- Cas n°3 (Case $Chb1) - Ici, le cas correspond au clic dans la case à cocher de la GUI1. Cela permet d'afficher une boite de dialogue indiquant l'action.
- Cas n°4 ($Btn2) - Ici, le cas correspond au clic sur le bouton de la GUI2. Cela permet d'utiliser deux fois la commande GUISetState() qui nous permet de masquer la GUI2 puis d'afficher la GUI1.
- Cas n°5 ($Rd1) - Ici, le cas correspond au clic dans le bouton radio de la GUI2. Cela permet d'afficher une boite de dialogue indiquant l'action.
Les deux dernières lignes du code,
EndSwitch et
WEnd permettent de 'fermer' respectivement les blocs
Switch et
While.