Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème avec dialogbox de dialogbox

11 réponses
Avatar
Roger
Bonjour,

J'ai une première dialogbox (dialogbox1) modale décrite dans le fichier
ressource que je lance par la fonction dialogbox avec sa propre callback,
dans cette callback (callback1) je n'ai aucun problème pour lire le contenu
de mes contrôles : edittext par GetDlgItemText ou listbox par
SendMessage(clesurcontrole, LB_GETTEXT, ...) etc. Toujours dans cette
callback lors de l'appui sur un bouton, je lance une 2ème dialogbox
(dialogbox2) par une deuxième fonction dialogbox, celle-ci est encore modale
décrite séparément dans le même fichier ressource et elle dispose de sa
propre callback (callback2). Dans cette callback2 de cette dialogbox2 je
récupère correctement la main lors du clic sur n'importe quel bouton, par
contre j'ai un problème avec les contrôles edittext, je n'arrive pas lorsque
je clique sur un bouton à lire le contenu des contrôles edittext, le
GetDlgItemText avec le handle de la fenêtre d'origine ne donne rien, le
GetDlgItem() pour récupérer avec la clé de la fenêtre d'origine un handle
sur le contrôle afin d'utiliser SendMessage(clesurcontrole, LB_GETTEXT,...)
ne donne rien non plus. Je pensais qu'en fait c'était parce que je ne peux
plus utiliser la clé de la fenêtre d'origine pour trouver les handle sur les
contrôles ce qui m'a amené à chercher une autre clé de fenêtre avec
nvellecle=GetWindow(cledorigine, GW_XXX) et ensuite à essayer ces nouvelles
clés pour trouver un handle sur mes contrôles, mais rien n'y fait !!

Help please.

Thanks

10 réponses

1 2
Avatar
Antoine
"Roger" a écrit dans le message de news:
4d9cc11f$0$32433$
Bonjour,

... Dans cette callback2 de cette dialogbox2 je récupère correctement la
main lors du clic sur n'importe quel bouton, par contre j'ai un problème
avec les contrôles edittext, je n'arrive pas lorsque je clique sur un
bouton à lire le contenu des contrôles edittext, le GetDlgItemText avec le
handle de la fenêtre d'origine ne donne rien,



Il n'y a en principe aucun probleme, tu peux lancer 50 dialogs, ça marche
toujours...
(et c'est le hande courant forcément , pas la premiere)
mais sans voir de code.. difficile
Avatar
Roger
(et c'est le hande courant forcément , pas la premiere)
mais sans voir de code.. difficile



Je me doutais bien que ça n'était pas le handle de la fenêtre d'origine,
mais le problème c'est que je n'en ai pas d'autre, la fonction Dialogbox qui
crée le dialogue ne fournit pas de handle:

Au départ je crée mon premier dialogue par:
nresult=DialogBox(n0instance, MAKEINTRESOURCE(Diagppal), clefenorigine,
(DLGPROC)AnalyseDialog);
dans cette callback je n'ai aucun problème pour lire mes contrôles, soit
avec GetDlgItemText(clefenorigine, IDC_edittext,...); pour les EDITTEXT,
soit avec clesurctrl=GetDlgItem(clefenorigine, IDC_listbox) suivi de:
SendMessage(clesurctrl, LB_GETTEXT, .......); dans le cas où c'est une
LISTBOX.
C'est toujours dans cette même callback que lors du traitement d'un bouton
(new),
je crée mon 2ème dialogue par:
nresult2=DialogBox(n0instance, MAKEINTRESOURCE(Diag2), clefenorigine,
(DLGPROC)AnalyseDiag2);

Mon 2ème dialogue s'affiche correctement, on voit qu'il a toujours été créé
avec en paramètre la clé de la fenêtre d'origine et qu'il dispose de sa
propre callback (callback2). Quand sur le traitement du clic sur un bouton
OK de ce 2ème dialogue je cherche à lire ce qu'il y a dans un EDITTEXT de ce
2ème dialogue par: GetDlgItemText(clefenorigine, IDC_date, tampon1, Tdat);
je n'obtiens rien.

J'ai essayé dans ma première callback de créer le 2ème dialogue
différemment:
J'ai d'abord cherché un handle sur le contrôle qui dans le 1er dialogue va
créer le 2ème dialogue par:
clectrl=GetDlgItem(cledialog, IDC_new); (IDC_new contrôle du 1er dialogue),
puis j'ai créé le 2ème dialogue en utilisant ce handle de contrôle en
paramètre:
nresult2=DialogBox(n0instance, MAKEINTRESOURCE(Diag2), clectrl,
(DLGPROC)AnalyseDiag2);
Et enfin dans la callback du 2ème dialogue j'essaie de lire toujours le même
EDITTEXT par:
GetDlgItemText(clectrl, IDC_date, tampon1, Tdat);

Et ça ne change rien, je n'obtiens toujours rien dans le tampon, je ne vois
pas quel autre handle je pourrais utiliser
A+
Avatar
Christian ASTOR
Roger a écrit :

Mon 2ème dialogue s'affiche correctement, on voit qu'il a toujours été créé
avec en paramètre la clé de la fenêtre d'origine et qu'il dispose de sa
propre callback (callback2). Quand sur le traitement du clic sur un bouton
OK de ce 2ème dialogue je cherche à lire ce qu'il y a dans un EDITTEXT de ce
2ème dialogue par: GetDlgItemText(clefenorigine, IDC_date, tampon1, Tdat);
je n'obtiens rien.



Mais on utilise juste le handle hDlg courant de la Callback.
LRESULT CALLBACK DialogCallback(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
Avatar
Roger
"Christian ASTOR" a écrit dans le message de
news: inl8vn$4ch$
Roger a écrit :


Mais on utilise juste le handle hDlg courant de la Callback.
LRESULT CALLBACK DialogCallback(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)



Merci, mais je n'ai qu'un handle c'est celui de la fenêtre initiale, je ne
vois pas où j'irai chercher le second:

Création 1er dialogue:
nresult=DialogBox(n0instance, MAKEINTRESOURCE(Diagppal), clefeninitiale,
(DLGPROC)AnalyseDialog);
BOOL CALLBACK AnalyseDialog(HWND clefeninitiale, UINT msg, WPARAM wParam,
LPARAM lParam)
ci-dessus tout baigne.

Création 2ème dialogue à l'intérieur de la callback ci-dessus:
nresultnew=DialogBox(n0instance, MAKEINTRESOURCE(Diagnew), clefeninitiale,
(DLGPROC)AnalyseDiagNew);
BOOL CALLBACK AnalyseDiagNew(HWND clefeninitiale, UINT msg, WPARAM wParam,
LPARAM lParam)
Ci-dessus ça ne marche plus

Et si j'essaie dans le 2ème cas de remplacer le handle de la fenêtre
initiale par le handle sur le contrôle du 1er dialogue qui lance le 2ème
dialogue ça ne marche pas non plus.
A+
Avatar
Christian ASTOR
Roger a écrit :
BOOL CALLBACK AnalyseDialog(HWND clefeninitiale, UINT msg, WPARAM wParam,
LPARAM lParam)

BOOL CALLBACK AnalyseDiagNew(HWND clefeninitiale




Pas bon ça, de nommer les handles de la même façon
Chaque handle courant est indépendant :

BOOL CALLBACK AnalyseDialog(HWND hDlg1, ...
BOOL CALLBACK AnalyseDiagNew(HWND hDlg2, ...
Avatar
Roger
"Christian ASTOR" a écrit dans le message de
news: inmeji$eh9$
Pas bon ça, de nommer les handles de la même façon
Chaque handle courant est indépendant :



A la lecture de ceci, je réalise que j'avais mal compris comment
fonctionnait la callback: DialogProc.
J'avais, donc à tort, imaginé qu'elle fonctionnait comme la callback:
WindowProc.
C'est à dire qu'à la callback WindowProc on lui passe comme paramètre
d'entrée le HWND qui nous a été fourni par la fonction CreateWindow, c'est
pour cela que je pensais qu'à la callback DialogProc aussi il fallait lui
fournir en paramètre d'entrée un HWND pris ailleurs (j'avais pris celui
donné par la fonction GetActiveWindow). Je réalise maintenant que c'est le
contraire, avec la fonction DialogProc c'est elle qui fournit le HWND en
paramètre de sortie !! Et effectivement en tout reprogrammant comme ça, ça
marche.
Pouvez-vous quand même me confirmer que cette fois ci, j'ai bien compris ?
Merci.

P.S. Un petit point cependant qui reste obscur, c'est que maintenant je me
demande comment, en ayant mal compris, c'est à dire en croyant passer un
paramètre en entrée (celui du GetActiveWindow) à la première DialogProc, le
1er des deux dialogue marchait quand même !?
Avatar
Christian ASTOR
Roger a écrit :

C'est à dire qu'à la callback WindowProc on lui passe comme paramètre
d'entrée le HWND qui nous a été fourni par la fonction CreateWindow, c'est
pour cela que je pensais qu'à la callback DialogProc aussi il fallait lui
fournir en paramètre d'entrée un HWND pris ailleurs (j'avais pris celui
donné par la fonction GetActiveWindow). Je réalise maintenant que c'est le
contraire, avec la fonction DialogProc c'est elle qui fournit le HWND en
paramètre de sortie !! Et effectivement en tout reprogrammant comme ça, ça
marche.
Pouvez-vous quand même me confirmer que cette fois ci, j'ai bien compris ?
Merci.




Pas exactement.
On ne passe aucun paramètre à une WndProc(), puisqu'elle permet de
définir la classe de fenêtre pour le RegisterClassEx() et est
indépendante de tout CreateWindow() qui s'en suit

Mais l'essentiel est que ça marche...
Avatar
Roger
"Christian ASTOR" a écrit dans le message de
news: innjqs$aju$
Roger a écrit :

C'est à dire qu'à la callback WindowProc on lui passe comme paramètre
d'entrée le HWND qui nous a été fourni par la fonction CreateWindow,
c'est
pour cela que je pensais qu'à la callback DialogProc aussi il fallait lui
fournir en paramètre d'entrée un HWND pris ailleurs (j'avais pris celui
donné par la fonction GetActiveWindow). Je réalise maintenant que c'est
le
contraire, avec la fonction DialogProc c'est elle qui fournit le HWND en
paramètre de sortie !! Et effectivement en tout reprogrammant comme ça,
ça
marche.
Pouvez-vous quand même me confirmer que cette fois ci, j'ai bien compris
?
Merci.





***********************************************************
Pas exactement.
On ne passe aucun paramètre à une WndProc(), puisqu'elle permet de définir
la classe de fenêtre pour le RegisterClassEx() et est indépendante de tout
CreateWindow() qui s'en suit

Mais l'essentiel est que ça marche...


************************************************************
Je pense qu'il y a un petit malentendu, ce que j'appelle WndProc c'est la
callback WindowProc, ce que toi tu appelles WndProc ça doit plutôt être la
structure WNDCLASS. Mais de toutes façons je reconnais que j'avais tout
compris de travers, en effet même pour les créations de fenêtre, je croyais
passer systématiquement le HWND fourni par CreateWindow à la callback
WindowProc d'autant que ça avait l'air de marcher. Mais je viens de réaliser
qu'en fait CreateWindow et la callback WindowProc fournissent toutes les
deux un HWND et c'est le même.
Merci
Avatar
Serge Paccalin
Le Fri, 8 Apr 2011 22:36:53 +0200, Roger a écrit
(dans <news:4d9f7146$0$7703$, posté
dans fr.comp.os.ms-windows.programmation) :

On ne passe aucun paramètre à une WndProc(), puisqu'elle permet de définir
la classe de fenêtre pour le RegisterClassEx() et est indépendante de tout
CreateWindow() qui s'en suit

Mais l'essentiel est que ça marche...


************************************************************
Je pense qu'il y a un petit malentendu, ce que j'appelle WndProc c'est la
callback WindowProc, ce que toi tu appelles WndProc ça doit plutôt être la
structure WNDCLASS. Mais de toutes façons je reconnais que j'avais tout
compris de travers, en effet même pour les créations de fenêtre, je croyais
passer systématiquement le HWND fourni par CreateWindow à la callback
WindowProc d'autant que ça avait l'air de marcher. Mais je viens de réaliser
qu'en fait CreateWindow et la callback WindowProc fournissent toutes les



Il y a une chose que je ne comprends pas. À te lire, j'ai l'impression
que tu appelles toi-même la DialogProc et que tu hésites/hésitais sur le
paramètre hWnd à lui fournir. A priori, on ne l'appelle jamais soi-même,
c'est le système qui s'en charge, au gré des événements à traiter. À
quelle occasion appelles-tu la DialogProc ?

--
___________
_/ _ _`_`_`_) Serge PACCALIN -- sp ad mailclub.net
_L_) Il faut donc que les hommes commencent
-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763
Avatar
Roger
********************************************************************
Il y a une chose que je ne comprends pas. À te lire, j'ai l'impression
que tu appelles toi-même la DialogProc et que tu hésites/hésitais sur le
paramètre hWnd à lui fournir. A priori, on ne l'appelle jamais soi-même,
c'est le système qui s'en charge, au gré des événements à traiter. À
quelle occasion appelles-tu la DialogProc ?
******************************************************************


Non, je n'appelle pas moi-même la WindowProc, ni la DialogProc.
Prenons d'abord le cas de CreateWindow, cette fonction fourni un HWND,
je mets en place ensuite la callback WindowProc appelée par Windows pour le
traitement des messages. Dans les paramètres de cette fonction, il y a un
HWND, je pensais, à tort, qu'il fallait que je mette comme paramètre HWND
celui qui m'avait été fourni par la CreateWindow. C'est ce que je faisais
depuis un certain temps et comme ça marchait sans problème, je restais sur
l'idée que ça fonctionnait selon cette logique. Ce qui m'a fait coincer et
appeler à l'aide c'est quand j'ai voulu créer une boîte de dialogue, si
j'étais passé par CreateDialog, cette fonction m'aurait fourni un HWND que
j'aurais cru passer à la callback DialogProc et si ça avait marché j'aurais
probablement continué à persister dans mon erreur. Ce qui m'a sauvé, en
fait, c'est que je ne suis pas passé par CreateDialog pour créer ma boîte
mais directement par DialogBox qui ne fournit aucun HWND, donc dans ma
logique erronée je me suis trouvé à court de HWND !!!
J'ai donc fini par comprendre, enfin je crois maintenant être dans le vrai,
que le HWND qu'il y a en paramètre dans la WindowProc ainsi que dans la
DialogProc, ça n'est pas un paramètre qu'on lui donne, mais un HWND que la
fonction nous fournit et de plus c'est le même que celui qui nous est fourni
par respectivement la CreateWindow et la CreateDialog.
A+
1 2