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 :

comment gérer les évenements de 2 fenetres dans une fonction


Sujet :

Windows

  1. #1
    Membre actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut comment gérer les évenements de 2 fenetres dans une fonction
    Bonjours messieurs dames...

    je dois faire une interface en win32, dans laquelle j'ai deux fenetres.

    J'arrive a traiter les évenements de la premiere, mais pour la seconde, qui est une fenetre fille, je bloque.

    Je crois savoir que c'est la même callback qui est appelée pour les deux fenetres, alors j'ai fait ca:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
    {
       
     //return procedure_fenetre_mere(hwnd,message,wParam,lParam);
    
     if (hwnd==frm_principale.get_handle())
    	{
    	 return procedure_fenetre_mere(hwnd,message,wParam,lParam);
    	}
     else
    	{
    	 return procedure_fenetre_fille(hwnd,message,wParam,lParam);
    	}
     
    
    }
    mais la condition du if ne se verifie jamais... je soupconne un probleme de type sur le handle mais je ne pense pas que ce soit la meilleur solution de toute facon. (la ligne en commentaire marche tres bien pour la fenetre mere)

    ?????
    Je débute en win 32 et je suis a la bourre dans mon projet, je vais me faire incendier
    Merci de me filer un p'tit coup de main

  2. #2
    Membre actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    petite precision: le type de la valeure renvoyée par la méthode get_handle()

    est HWND

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 571
    Points
    41 571
    Par défaut
    Qu'est-ce que tu appelles procedure_fenetre_mere ?

    En plus, si c'est la même callback qui est utilisée pour les deux, cela veut dire que la fonction va s'appeler elle-même jusqu'à ce que la pile explose!
    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.

  4. #4
    Membre actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    la procedure fenetre mere contient les traitements de la fenetre mère.

    c'est la windowprocédure classique.

    l'idée c'est de faire une redirection dans la callback vers des fonctions contenant les switchs des évenements a traiter pour chaque fenetre.
    La pile "n'explose pas" si les retours de fonctions sont bien fait, et s'il n'y a pas de bugs...

    Ce que je voulais savoir moi c'est pourquoi mon if ne marche pas et si il y a une meilleur solution algorimithmiquement parlant...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 571
    Points
    41 571
    Par défaut
    Tu sais, pour l'instant, j'ai énormément de mal à te comprendre, et à comprendre où tu veux en venir: Normalement, une fenêtre fille n'a AUCUN traitement similaire à celui de la fenêtre mère, pour moi...

    Pourrais tu, s'il te plait, poster:
    * Le contenu de des "classes de fenêtre" (WNDCLASS, RegisterClass() etc.)
    * Le code de création (CreateWindow() etc.)
    * Un code réduit au minimum de ta (tes) procédure(s) de fenêtre.

    ?
    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 actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    hé bien ca va etre dur, parce que j'ai encapsulé l'enregistrement, la création des fenetres et d'autres méthodes dans des classes, et en volume de code ca fait beaucoup.

    Je veux juste savoir comment gérer les évenements de deux fenetres..
    une mere, et une fille. Je commence a douter de la necessité de n'avoir qu'une seule fonction de gestion des évenements au vu de ce que j'ai trouvé sur le net.
    est-ce que toi tu as déjà developpé des appli avec deux fenetres?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 571
    Points
    41 571
    Par défaut
    Oui, et plutôt deux fois qu'une.

    Et à chaque fois, j'utilisais une WindowProc différente pour chaque type de fenêtre (sauf pour les boites de dialogues: Elles ont toutes la même WindowProc, mais des DialogProcs différentes). D'ailleurs, c'est la méthode habituelle.

    Et bien évidemment, des fenêtres mêre et fille sont forcément deux types de fenêtre différents.
    Pas de problème ensuite pour le choix, chaque procédure ne recevra que les messages destinés à la fenêtre correspondante: L'appel à DispatchMessage() dans la boucle de messages principale fait très bien son boulot.



    (Ensuite, si tu joues avec des classes et des fonctions membres comme le fait MFC, là il est possible que la WindowProc soit commune (généralement, elle redirige vers des procédures dans les classes C++). Mais si tu n'as jamais programmé en multifenêtre, je te déconseille cette pratique (qui est toutefois un bon exercice de gymnastique mentale), car elle n'est pas facile à mettre correctement en oeuvre.
    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 actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    Ainsi soit-il. j'essayerai avec deux fonctions de traitements des événements alors.

    si je mets deux fonctions, la procedure par défaut c'est la même pour les deux?

    J'avais déjà testé, mais ca ne marchait pas du tonnerre. j'ai du me planter quelque part.

    est ce que pour les 2 fenetres le champs WndClass->lpszClassName est le même?

    Quel valeur a tu mis pour le dwStyle dans CreateWindowEx pour les deux fenetres? j'utilise overlapped mais apperement c'est pas commun pour faire du mdi, mais je ne savais pas quoi mettre d'autre

    Pour dire qu'une fenetre dépend d'une autre il suffit de mettre le HWND de la fenetre mère dans hWndParent de CreateWindowEx, ou il y autre chose a préciser?

    ...
    Je vais bien finir par arriver a quelque chose !!

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 571
    Points
    41 571
    Par défaut
    Alors: Deux types de fenêtre différent, donc deux "classes de fenêtre" différentes. Et comme une classe de fenêtre est connue par son nom, oui.

    Pour le style, ça dépend ce que tu veux comme fenêtre fille: Une "Child Window" est incrustée dans la fenêtre mère, une "Owned Window" n'est pas incrustée, mais n'a pas d'icône dans la barre des tâches et est toujours au-dessus de sa propriétaire.

    Pour une child window, il faut le style WS_CHILD (plus d'autres si tu veux) et le paramètre hWndParent doit être le HWND de la fenêtre mère.

    Pour une owned window, il faut un style normal (WS_OVERLAPPED, WS_POPUP, WS_OVERLAPPEDWINDOW, etc.) et le paramètre hWndParent doit être le HWND de la fenêtre mère.

    Pour une fenêtre complètement indépendante, il faut un style normal et le paramètre hWndParent doit être NULL.

    Pour en savoir plus (c'est de là que je tiens ces infos):
    Win32 Window Hierarchy and Styles
    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.

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut

    C'est spécifique Windows, je déplace.

    Le principe: à une classe de fenêtre (WndClass->lpszClassName) correspond une procédure de fenêtre.
    Dans ton cas, il semblerait que tu doives remplacer WindowProcedure soit par procedure_fenetre_mere soit par procedure_fenetre_fille en fonction du contexte.

  11. #11
    Membre actif Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Points : 248
    Points
    248
    Par défaut
    certes, c'est ce que je comptais faire, mais le test de redirection ne marche pas:

    if (hwnd==frm_principale.get_handle())

    ??
    Je crois avoir un problème avec le type HWND
    Comment faire sinon pour rediriger vers la bonne procédure?

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 571
    Points
    41 571
    Par défaut
    1°) Tu programmes en quoi, exactement? Elle te vient d'où, cette classe C++ ?
    2°) Qui parle de rediriger soi-même vers la bonne procédure de fenêtre? La procédure est inscrite dans la définition de la "Classe de fenêtre". DispatchMessage() choisit la procédure correspondante, tout simplement! Si tu as un message reçu par la mauvaise procédure, c'est que tu as mal défini tes classes de fenêtres...
    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.

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 681
    Points
    10 681
    Billets dans le blog
    3
    Par défaut
    Tu n'as aucune redirection à faire. Tout se passe dans WNDCLASS.lpfnWndProc, c'est là que tu spécifies procedure_fenetre_mere dans un cas, et procedure_fenetre_fille dans l'autre. Tu as 2 RegisterClass à faire.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/05/2011, 11h21
  2. Réponses: 2
    Dernier message: 24/03/2011, 15h18
  3. Réponses: 1
    Dernier message: 22/03/2008, 15h52
  4. Réponses: 26
    Dernier message: 30/07/2007, 12h09
  5. [DAO] Comment gérer les liens avec la bdd dans mes classes?
    Par Wormus dans le forum Autres
    Réponses: 6
    Dernier message: 22/02/2006, 16h14

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