IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Problème avec dialogbox de dialogbox


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Problème avec dialogbox de dialogbox
    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

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans ta seconde boîte de dialogue, tu veux lire les contrôles EditText de quelle boîte? La première ou la seconde?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Dialogbox de dialogbox
    De la 2ème bien sûr !
    Dans la 1er dialogbox je lis sans problème les contrôles de la 1ère.
    Dans la 2ème dialogbox, je n'arrive pas à lire les contrôles de la 2ème !

    Rappel: la 2ème dialogbox est lancée dans la callback de la 1ère.

    Pour lire dans la 1ère les contrôles de la 1ère j'utilise comme paramètre le handle de la fenêtre d'origine et en deuxième paramètre l'IDC du contrôle que je veux lire soit directement si c'est un edittext soit après avoir trouvé avec ces deux paramètres un handle sur le contrôle si c'est un sendmessage sur une listbox (procédure classique) !

    Pour lire dans la 2ème les contrôles de la 2ème je ne vois pas quel handle je peux utiliser???? puisqu'avec le handle de la fenêtre d'origine + l'IDC du contrôle ça ne marche pas, ni pour lire directement (avec GetDlgItemText) ni pour calculer un handle sur le contrôle (avec GetDlgItem puis SendMessage).

    Pourtant dans la 2ème quand je clique sur un bouton (OK par ex) de la 2ème je récupère bien la main où il faut dans la callback de la 2ème. Même mieux, si dans ma callback je place dans le switch un case : IDC_ du contrôle de l'edittext concerné, je passe bien par là dès que je rentre un caractère dans le champ de l'edittext, mais ce qui m'intéresse c'est de pouvoir lire le contenu de l'edittext quand je clique sur le bouton OK.
    Merci

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Suite de mon message précédent
    Création du 1er dialogue avec la clé de la fenêtre d’origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    nresult=DialogBox(n0instance, MAKEINTRESOURCE(Diagppal), clefenorigine, (DLGPROC)AnalyseDialog);
    // lecture d’un EDITTEXT du 1er dialogue :
    GetDlgItemText(clefenorigine, IDC_edittext,...);
    // Lecture d’une LISTBOX du 1er dialogue:
    clesurctrl=GetDlgItem(clefenorigine, IDC_listbox);
    // puis
    idx=SendMessage(clesurctrl, LB_GETCURSEL, 0, 0);
    SendMessage(clesurctrl, LB_GETTEXT, idx, .......);
    Tout ceci fonctionne correctement

    Ensuite
    Dans la callback du 1er dialogue dans le traitement du contrôle IDC_new du 1er dialogue, je crée le 2ème dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nresult2=DialogBox(n0instance, MAKEINTRESOURCE(Diag2), clefenorigine, (DLGPROC)AnalyseDiag2);
    // Enfin, dans le traitement d’un bouton de ce 2ème dialogue, je veux lire le
    // contenu de l’EDITTEXT IDC_date de ce 2ème dialogue par:
    GetDlgItemText(clefenorigine, IDC_date, tampon1, Tdat);
    Et là je n’obtiens plus rien

    J’ai essayé une autre solution qui consiste dans le 1er dialogue à d’abord chercher un handle sur le contrôle en cours de traitement, celui qui va créer le 2ème dialogue par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    clectrl=GetDlgItem(clefenorigine, IDC_new);
    // (IDC_new dans 1er dialogue)
    // Puis j’ai utilisé ce handle pour créer le 2ème dialogue:
    nresult2=DialogBox(n0instance, MAKEINTRESOURCE(Diag2), clectrl,(DLGPROC)AnalyseDiag2);
    Et enfin, dans le traitement d’un bouton de ce 2ème dialogue, pour lire le contenu de l’EDITTEXT IDC_date de ce 2ème dialogue j’utilise maintenant ce nouveau handle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetDlgItemText(clectrl, IDC_date, tampon1, Tdat);

    Et je n’obtiens toujours rien !!

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Euh... La DialogProc de la seconde boîte de dialogue reçoit sa clé en paramètre, donc je ne vois pas le problème...

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*Note: Si la fonction est déclarée comme ça, tu ne devrais pas avoir besoin du cast en (DLGPROC)*/
    INT_PTR CALLBACK ProcSecondeBoite(HWND cleSecondeBoite, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg)
    	{
    		...
    	case ...:
    		GetDlgitemText(cleSecondeBoite, IDC_EditDansSecondeBoite, ...);
    		...
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Problème résolu
    Bon, je viens de réaliser 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 dialogues marchait quand même !?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ça marche comme WindowProc, mais tu n'as pas compris son fonctionnement.
    Ou plutôt, le fonctionnement de CreateWindow() et ses fonctions soeurs.

    Le HWND passé en paramètre est celui de la fenêtre parent (ou dans notre cas, la fenêtre owner) de la fenêtre ou boîte de dialogue.

    CreateWindow et CreateDialog retournent le HWND de la fenêtre/boîte créée, mais tu en as rarement besoin à ce point: Après tout, le système te retransmet directement ce HWND quand il appelle la WindowProc ou DialogProc, donc tu n'as généralement pas besoin de le mémoriser.

    PS:Utilise juste NULL comme owner de ta fenêtre principale. N'utilise pas GetActiveWindow() (qui retournera NULL de toute façon vu que tu n'as pas encore de fenêtre), ni GetForegroundWindow (qui touche aux autres processus) et surtout pas GetDesktopWindow().

    Par contre, lors de la création de la seconde boîte, tu peux utiliser le HWND de la première comme owner.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 214
    Points : 99
    Points
    99
    Par défaut Dialogbox (suite)
    Effectivement, je n'avais pas compris comme ça le fonctionnement de WindowProc, je croyais lui passer en paramètre à chaque fois le HWND fourni par CreateWindow, d'autant plus que ça marchait ! Mais si j'ai bien compris ce que tu dis, de toutes façons WindowProc et CreateWindow fournissent le même HWND.

    Pour les boîtes de dialogue par contre, je n'ai pas utilisé CreateDialog, donc je n'avais pas de 1er HWND fourni, j'ai créé directement mes boites de dialogue par DialogBox. Mais si j'ai encore bien compris ce que tu dis: CreateDialog (que je n'ai pas utilisé) et DialogProc fournissent encore le même HWND.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problèmes avec la fonction DialogBox
    Par saidus dans le forum Windows
    Réponses: 2
    Dernier message: 21/06/2010, 10h00
  2. Problème avec DialogBox
    Par stouf() dans le forum GWT et Vaadin
    Réponses: 1
    Dernier message: 30/01/2009, 12h05
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo