|
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.
PrincipeUne 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.
Création de la boite de dialogueLes 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);
Gestion de la saisie dans la boite de dialoguePour 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]