Index du site
Google

La boite de dialogue

Copie d'écran

L'archive zippée tec012.zip contient les fichiers de la page.

Pour nous permettre d'ouvrir un fichier, de choisir une police de caractères, de choisir une couleur dans une palette ou encore sous forme de boite à outils, les boites de dialogue sont omniprésentes - et l'onglet consacré à la Message Box est un exemple parmi d'autres. Ce programme propose de faire apparaître une boite de dialogue pour saisir du texte, qui sera (après validation) affiché dans le contrôle edit de la fenêtre principale.

haut de page  Principe

Une boite de dialogue est une fenêtre de style WS_POPUPWINDOW, autrement dit elle surgit à l'écran quand elle est appelée. Dans cette page, nous fabriquons une boite de dialogue pour saisir un identifiant et un mot de passe, le tout constituant un login (de log, enregistrer). Cette boite a pour enfants deux contrôles edit à une ligne, deux contrôles static faisant fonction d'étiquettes et deux boutons (valider et annuler). Ces contrôles sont traités dans le détail dans l'onglet Contrôles - à noter que le deuxième contrôle edit est particulier car il est créé avec le style ES_PASSWORD (mot de passe): les caractères sont affichés sous forme de disques (ou d'astérisques si le style Windows XP n'est pas activé). En choisissant l'item Login du menu Saisie ou en appuyant sur le raccourci clavier F2, l'utilisateur fait apparaître la boite de dialogue dont le contenu est lu et recopié dans un contrôle edit multiligne. Nous passerons sur les bases (voir l'onglet ProgWin), pour nous intéresser aux particularités du sujet.

haut de page  Création de la boite de dialogue

Les caractéristiques de la boite de dialogue, entre autres son style et ses contrôles, sont déclarés dans le fichier ressource (tec012.rc). Le résultat est similaire mais le langage de ce type de fichier, que nous avons vu aussi pour les menus, est différent de ce que nous avons l'habitude de coder dans les appels à la fonction CreateWindow:

/***********************************************
* Boite de dialogue ouverte par IDM_DLG_SAISIE *
***********************************************/
ID_DLG_SAISIE DIALOG DISCARDABLE 0, 0, 0, 0

STYLE WS_POPUPWINDOW | WS_DLGFRAME | WS_SIZEBOX
CAPTION "..."
FONT 12, "MS Sans Serif"
BEGIN
    PUSHBUTTON "",IDC_DLG_SAISIE_VALIDER,0,0,0,0
    PUSHBUTTON "",IDC_DLG_SAISIE_ANNULER,0,0,0,0
    EDITTEXT IDC_DLG_SAISIE_EDIT,0,0,0,0,ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE
    EDITTEXT (IDC_DLG_SAISIE_EDIT + 1),0,0,0,0,ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | ES_PASSWORD
    RTEXT "", IDC_DLG_SAISIE_STATIC,0,0,0,0,WS_CHILD | WS_VISIBLE
    RTEXT "", (IDC_DLG_SAISIE_STATIC + 1),0,0,0,0,WS_CHILD | WS_VISIBLE
END

Cette boite de dialogue possède sa propre fonction callback, que nous appelons DlgSaisieProc. Les différences principales avec la fonction callback de la fenêtre principale WndProc sont: le message WM_INITDIALOG qui remplace WM_CREATE, et le traitement du message WM_DESTROY, qui est PostQuitMessage(0) pour la fenêtre principale mais pas pour la boite de dialogue. Dans le fichier source tec012.c, l'apparition de la boite de dialogue est provoquée par la fonction DialogBox, en indiquant entre autres paramètres le nom de la fonction de callback spécifique de la boite:

DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_DLG_SAISIE), hWnd, (DLGPROC) DlgSaisieProc);

Dans la fonction DlgSaisieProc, la récupération des handles des contrôles se fait en appelant la fonction GetDlgItem, par exemple pour un des boutons:

hDlgBoutonValider = GetDlgItem(hwndDlg, IDC_DLG_SAISIE_VALIDER);

haut de page  Gestion de la saisie dans la boite de dialogue

Pour récupérer le contenu d'un contrôle edit, nous envoyons un message WM_GETTEXTLENGTH pour lire la longueur du texte, puis nous faisons appel à une allocation dynamique de mémoire sur un pointeur de TCHAR, ensuite un message WM_GETTEXT permet de récupérer la chaîne de caractères, enfin la mémoire est libérée - voici le morceau de code:

// ...
lLongueur = SendMessage(hDlgEdit[0], WM_GETTEXTLENGTH, (WPARAM) 0, (LPARAM) 0);
sIdent = malloc((lLongueur + 1) * sizeof(TCHAR));
if (NULL == sIdent) return(RET_ERR_ALLOC);
SendMessage(hDlgEdit[0], WM_GETTEXT, (WPARAM) lLongueur + 1, (LPARAM) sIdent);
// ...
if (NULL != sIdent) free(sIdent);

Les chaînes de caractères lues dans les contrôles edit sont un identifiant et un mot de passe, ce dernier étant crypté à la lecture et impossible à copier. Ces éléments sont écrits dans une chaîne temporaire et recopiés dans le contrôle edit de la fenêtre principale:

// ...
sTemp = malloc((lLongueurTotale + 1) * sizeof(TCHAR));
if (NULL == sTemp) return(RET_ERR_ALLOC);
_stprintf(sTemp,
    _T("%s%s\r\n%s%s"),
    sDlgStatic[0], sIdent,
    sDlgStatic[1], sPass);
*(sTemp + lLongueurTotale) = '\0';
SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM) sTemp);
// ...
if (NULL != sTemp) free(sTemp);

La boite de dialogue est fermée pour rendre la main à la fenêtre principale, en précisant un code de retour lié au bouton cliqué - par exemple l'utilisateur vient de valider la saisie:

EndDialog(hwndDlg, (INT_PTR) IDC_DLG_SAISIE_VALIDER);

Pour des précisions et des exemples sur les contrôles (edit, button) le lecteur cliquera sur l'onglet Contrôles. Pour une explication en détails d'un programme Windows, voir l'onglet ProgWin.

[màj 8 novembre 2007]

Copyright © 2008 B. Challier • légalcontact Valid XHTML 1.0 Valid CSS 2haut