Dialog-box

 

Introduction

Les boîtes de dialogue sont utilisées pour obtenir des données ou des renseignements. Généralement, dansun menu, une option, qui lance une boîte de dialogue, aura son libellé suivi de 3 points de suspension pour indiquer l'affichage d'une nouvelle fenêtre.

Par exemple, l'option "Ouvrir" lance une boîte de dialogue permettant de sélectionner un fichier. Le libellé sera alors le suivant: "Ouvrir..."

Une boîte de dialogue est en fait une fenêtre de type popup qui comme une fenêtre classique pourra avoir des fenêtres enfants de contrôle.

Un outils est utilisable pour la création de la fenêtre de dialogue. Les informations sur le contenu de la fenêtre de dialogue seront enregistrées dans un fichier script. Ce qui facilite énormement le développement.

Tout comme les fenêtres classiques, vous retrouverez une procédure de gestion des messages qui sera rattachée à la dialog-box. Cependant, cette procédure sera simplifiée car elle se limitera le plus souvent à initialiser des contrôles enfants lors de la création de cette dialogue, pour traiter les messages provenant des contrôles enfants et pour quitter la dialogue-box. La gestion des focus sera quant-à elle gérée intégralement par Windows !

 

Dessiner votre dialogue box

Sous Visual Studio 2013 Community

Si le fichier resource.rc n'existe pas dans votre projet (regardez dans la vue Resource View de votre projet, tous les fichiers y sont listés), il faut d'abord le créer.

Puis, pour ajoutez une ressource Dialog, il suffit d'un clique droit sur le fichier resource.rc dans la vue Resource View et choisir l'option add resource. L'écran suivant s'affichera:

Image non trouvée !

Choisir Dialog et l'editeur se lancera !

A gauche, ecrit à la verticale, il y a ToolBox, vous pourrez y piocher les contrôles que vous poserez dans votre dialogue.

Image non trouvée !

Oui, l'ergonomie devient bizarre ces derniers temps !

Image non trouvée !Dans les versions "légères" de Visual Studio, l'éditeur n'existe pas.

 

Boîtes de dialogue non modales, modales et systèmes modales

les Boîtes de dialogue "classiques" sont dites non modales lorsqu'elles ne sont pas bloquantes, l'utilisateur peut aller où il veut dans le programme.

les Boîtes de dialogue modales sont des boîtes de dialogue qui lorsqu'elles sont affichées, n'autorisent pas l'utilisateur à cliquer sur une autre fenêtre du programme, il doit impérativement fermer la boîte de dialogue avant ! Mais rien n'empêche l'utilisateur de passer d'un programme à un autre.

les Boîtes de dialogue systèmes modales sont encore plus restrictives, puisqu'elles n'autorisent plus l'utilisateur à aller hors du programme.

 

Création d'une instance dialogue-box

Après avoir dessiné une dialogbox, il faut l'afficher !

Pour afficher une boîte de dialogue, il faut tout d'abord savoir si vous voulez la lancer en modale ou non.

Cas d'une dialogue modale

Il faudra dans ce cas utiliser la fonction suivante:

INT_PTR DialogBox(

HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);

En entrée:

hInstance : l'instance de votre application qui lance la dialogue box.

lpTemplate : Le nom ou l'identifiant (dans ce dernier cas, la partie haute doit être à 0, on utilisera la macro MAKEINTRESOURCE) de la ressource du template de votre dialogue box.

hWndParent : le handle de la fenêtre parent.

lpDialogFunc Pointeur sur la procédure de gestion des messages de la dialogue box.

Image non trouvée ! Cette fonction ne rendra pas la main tant que l'utilisateur n'aura pas mis fin à l'existance de cette dialogue (modale oblige !). Voir la fonction EndDialog() un peu plus loin.

En sortie: 0 si le handle de la fenêtre n'est pas valide. Sinon, il s'agit du code retoruné par la fonction EndDialog().

 

Création d'une dialogue non modale

Vous utiliserez cette fois-ci la fonction:

HWND CreateDialog(

HINSTANCE hInstance,
LPCTSTR lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);

Les paramètres étant identiques à ceus de DialogBox()

En sortie, 0 si la fonction échoue. Sinon, le handle de la dialog-box.

Image non trouvée !La dialogue box apparaîtra à l'écran si le style WS_VISIBLE est positionné ! Sinon, il faudra utiliser la fonction ShowWindow().

 

Mettre fin à une boîte de dialogue

Dans le cas d'une dialogue modale, vous utiliserez la fonction suivante:

BOOL EndDialog(

HWND hDlg,
INT_PTR nResult
);

En entrée:

hDlg : Le handle de la dialogue à détruire.

nResult : Un code qui sera retourné à la fonction ayant créer la dialogue.

En sortie, la fonction retourne 0 si pb.

 

Pour les dialogues non modales, vous utiliserez la fonction DestroyWindow()

 

La procédure de gestions des messages d'une dialogue

Elle ressemble fort à celle d'une fenêtre classique.

La syntaxe est la suivante:

LRESULT CALLBACK DialProcEmul(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)

 

Mais pour initialiser une dialogue, le système va envoyer le messages WM_INITDIALOG (et non WM_CREATE) !

 

Un exemple

Affichage simple d'une dialogue !

Code:Image non trouvée !Ressourcescript

Choisir un projet de type application windows 32 bits.

 

 

Création d'un script 'à la main' pour définir le template de la dialogue.

A venir ...

 

Remarques

Il est possible de se créer des dialog-box dynamiques en créant un scripte dans votre code suivant par exemple des options précédemments choisies par l'utilisateur. Dans ce cas il faudra utiliser

Pour une dialogue modale:

INT_PTR DialogBoxIndirect(

HINSTANCE hInstance,
LPCDLGTEMPLATE lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);

Non modale:

HWND CreateDialogIndirect(

HINSTANCE hInstance,
LPCDLGTEMPLATE lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc
);

 

Il existe aussi la fonction

BOOL IsDialogMessage(

HWND hDlg,
LPMSG lpMsg
);

qui permet d'interpréter les codes du clavier comme il faut pour une boîte de dialogue. Par exemple la touche TAB va permettre de passer le focus au controle suivant. Ceci est utile pour ceux voulant gérer leur propre fonction de lecture des messages de la dialogue...

 

J'y reviendrai peut-être plus tard...

Sinon, voyez les explications de Microsoft...

 

Gestion des contrôles courants:

Il s'agit en fait des contrôles boutton, editeur:

Lors de la création d'une fenêtre, vous référencez les contrôles par des identifiants.

Or les fonctions que vous avez pu voir jusqu'à présent sur les contrôles utilisent un handle sur ce contrôle. Vous ne pourrez donc plus les utiliser...

 

Il existe deux fonctions pour alimenter un éditeur par son identifiant:

SetDlgItemText(hDlg, IDC_EDIT1, cDirectory); et SetDlgItemInt (à vérifier)

De même, vous pourrez récupérer le contenu de l'éditeur:

GetDlgItemText(hDlg, IDC_LIGNE, cBuffer, 99); pour un texte

GetDlgItemInt pour un entier.

 

Concernant les autres fonctions, il faut récupérer le handle !

D'où la fonction GetDlgItem(hDlg, IDC_LIGNE)

Vous passez alors le handle de la dialogue et l'identifiant du contrôle, vous recevrez en sortie le handle d'un contrôle.

Il sera alors possible d'activer, désactiver, ... ou de donner le focus à un contrôle précis:

SetFocus(GetDlgItem(hDlg, IDC_LIGNE));