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

MFC Discussion :

Messages Privés - Eclaircissement


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut Messages Privés - Eclaircissement
    Bonjour,

    j'aurais une question à propos des messages privés pour être bien certain que le choix de cette méthode va bien être celle que je vais utiliser dans mon code par la suite (je fais mon UML là )

    J'ai 2 classes, les messages privés peuvent ils être handlés d'une classe à l'autre

    ex:
    - une classe MainDialog (Dialog MFC) contenant des handlers ON_MESSAGE(WM_XXX, OnXxx)
    - une classe API "lançant" des messages privés avec PostMessage(WM_XXX)

    la MainDialog pourra-t'elle handler les messages privés lancés par l'API?

    un éclaircissement là dessus me rendrait grand service, je débute avec toutes ces histoires de messages privés&co, ce qui me fait mélanger pas mal tous les concepts

    merci d'avance

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Ben, normalement, oui.
    Du moment que le message est bien envoyé à la bonne fenêtre, elle le recevra, que les types (API ou MFC) du lanceur et de l'émetteur soient différents ou non.
    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
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    reponse oui, tu peux lancer un message privé a partir du moment ou tu disposes d'un handle de fenetre en win32 (HWND) avec :ostMessage(... ou pour
    une classe fenetre myWnd->PostMessage(...


  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    ok merci pour cet éclaircissement, ça me rassure drôlement...ouf

    pour être plus précis dans ma classe API je devrais juste rajouter le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "MainDialog.h"
     
    [...]
    MainDialog  *pThis=reinterpret_cast< MainDialog *>( pvParam);
    [...]
    ::PostMessage(*pThis,WM_XXX,0,0);
    isn't it?

    merci encore pour vos conseils avisés!

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    nan !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pThis->PostMessage(WM_XXX);
    // ou
    ::PostMessage(pThis->GetSafeHwnd() ,WM_XXX,0,0);

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    mmh dernière chose

    ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainDialog  *pThis=reinterpret_cast< MainDialog *>( pvParam);
    je le tire de l'utilisation d'un thread, d'où le pvParam, mais dans le cas d'une classe "normale", comment dois-je obtenir le *pThis?

    j'imagine qu'il faut que je passe le pointeur de ma classe MainDialog à la création de ma classe API, c'est bien çà?

    (le C++ est mon ami...)

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    parceque si je peux passer un pointeur sur le MainDialog dans ma classe API, il n'y a plus d'utilité à utiliser les messages privés (oulala ca s'embrouille kill me)

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    pointeur sur la mainframe : AfxGetMainWnd() a caster si necessaire avec la classe du projet.

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    ok et donc à partir de AfxGetMainWnd() je peux chopper le pointeur sur ma fenetre de dialogue et donc effectuer mes PostMessage(...)!

    et bien merci encore


  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    ...

    hum...

    d'un point de vue pratique est-ce que utiliser les messages privés, plutot que d'appeler directement mes méthodes dans ma classe MainDialog récupérée grâce à AfxGetMainWnd(), comporte un avantage ou bien est-ce juste une erreur de jugement de ma part finalement...

    je dis ça parceque j'ai repris les PostMessage d'un cas d'utilisation avec thread, mais j'ai plus vraiment l'impression que ces événements me soient utiles si je peux appeler directement les méthodes...

    (la modélisation est mon amie...)

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par mr.saucisse
    ok et donc à partir de AfxGetMainWnd() je peux chopper le pointeur sur ma fenetre de dialogue et donc effectuer mes PostMessage(...)!

    et bien merci encore

    fenetre de dialogue si ton projet est un projet boite de dialogue ...
    AfxGetMainWnd() renvoie un pointeur sur la classe nommée CMainFrame dans ton projet.

  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    mon projet est un activeX j'ai donc une classe MonActiveXPropPage et une classe MonActiveXCtrl + une classe MainDialog, qui est une fenetre de dialogue où j'ai tous mes boutons et mes editbox, que je place sur MonActiveXCtrl



    j'imagine donc que AfxGetMainWnd() doit me renvoyer un pointeur sur la classe MonActiveXCtrl

  13. #13
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    ben fallait le dire plus tôt ! ça n'a plus rien a voir avec une application MFC classique...
    du coup je ne comprends plus trop ton probleme ,quel est le probleme pour disposer du pointeur sur la dialogue crée dans l'activex ?

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    j'ai une classe qui sous l'effet d'un événement extérieur lance une méthode qui doit effectuer des changements sur mon interface graphique.

    et je pensais au début que cela devait se réaliser ainsi:
    1)Reception Event externe dans la classe API
    2)Sur reception lancement Méthode interne de la classe API qui envoie PostMessage
    3)Réception du Message privé dans la fenetre de dialogue (classe MainDialog) =>invoque la Méthode de changement de la fenetre de dialogue

    mais apparemment comme tu parlais de pouvoir obtenir le pointeur sur la fenetre principale j'ai pensé après que ca allait se réaliser ainsi:
    1)Reception Event externe dans la classe API
    2)Sur reception de cet event Lancement de la Méthode de la classe API = pointeurMainDialog.Méthode de changement de la fenetre de dialogue

    le pointeurMainDialog étant tiré à partir de AfxGetMainWnd()

    le tout dans un activeX.

    je ne sais pas si c'est bien clair.

  15. #15
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Tu peux sans problème intercepter un message privé dans la classe fenêtre de ton activex.
    l'interception se fera sur la fenêtre principal de l'activex.

    Tu enverras le message à partir de la fenêtre parent de l’activex (la boîte de dialogue ou la CFormView contenant l’activex) comme pour une autre fenêtre de l’application.
    En faisant myActivex.PostMessage(wm_PRIVATExxx) ;

    c'est clair ?

  16. #16
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    en fait ce que je veux réaliser c'est invoquer des méthodes contenues dans ma classe MainDialog (la classe de la fenetre de dialogue de mon interface graphique), à partir d'une méthode contenue dans la classe API instanciée par MainDialog

    c'est pourquoi je ne voulais pas donner de pointeur sur ma classe MainDialog à la classe API et plutot passer par un mécanisme de PostMessage, mais à force d'y réfléchir je pédale un peu dans la semoule

  17. #17
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    Citation Envoyé par farscape
    Tu peux sans problème intercepter un message privé dans la classe fenêtre de ton activex.
    l'interception se fera sur la fenêtre principal de l'activex.

    Tu enverras le message à partir de la fenêtre parent de l’activex (la boîte de dialogue ou la CFormView contenant l’activex) comme pour une autre fenêtre de l’application.
    En faisant myActivex.PostMessage(wm_PRIVATExxx) ;

    c'est clair ?
    oui, de ce point de vue c'est clair (je te remercie pour ta patience...)

    maintenant ce n'est pas à partir de ma classe qui contient l'instance de MainDialog que je veux invoquer les méthodes de MainDialog, c'est à partir d'une classe instanciée par MainDialog, ou à la limite instanciée en même temps que MainDialog dans la fenetre principale, c'est ce qui me pose problème.

  18. #18
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par mr.saucisse
    en fait ce que je veux réaliser c'est invoquer des méthodes contenues dans ma classe MainDialog (la classe de la fenetre de dialogue de mon interface graphique), à partir d'une méthode contenue dans la classe API instanciée par MainDialog

    c'est pourquoi je ne voulais pas donner de pointeur sur ma classe MainDialog à la classe API et plutot passer par un mécanisme de PostMessage, mais à force d'y réfléchir je pédale un peu dans la semoule
    houlalala c'est bien compliqué pour si peu de chose !
    Il faut initialiser un pointeur sur la classe principale de dialogue.
    Essaie de faire au plus simple.
    Parce que dans 6 mois tout ton code va passer à la trappe.
    Et UML c'est vraiment pas nécessaire; UML c'est pour modéliser un SI avec des classes faisant abstraction de préférence de l'interface graphique.

  19. #19
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    bon dans ce genre de choses il faut bien preciser ou on est et ou on veut aller.
    si tu veux envoyer un message de l'activex vers la boite de dialogue pour lancer un traitement ,oui c'est comme ça qu'il faut faire.
    a partir de l'activex pour avoir le pointeur sur la fenetre le contenant il faudra faire(c'est un exemple bien sûr) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CMyOcxCtrl::OnDraw(
    			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
    {
    	// TODO: Replace the following code with your own drawing code.
    	if(m_hWnd!=NULL && m_First)
           {
    		GetParent()->SendMessage(WM_PRIVATE_MSG_INIT,(WPARAM)m_hWnd);			
                    m_First=false;
    	}
    //....
    GetParent() renvoie le parent de l'activex donc la dialog ou la form qui le contient...

  20. #20
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 152
    Par défaut
    ok merci pour ces conseils, je vais essayer de modéliser mon truc un peu différemment(i.e. mieux), je crois que tout ce buzz tient à une confusion avec ces histoires de PostMessage

    je vais simplement passer un pointeur vers ma MainDialog aux classes désirées et modifier mon interface directement en invoquant des m_MyMainDialog->blabla...


Discussions similaires

  1. Envoi de messages privés : quel délai ?
    Par nikalkal dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 22/02/2006, 14h16
  2. Réponses: 1
    Dernier message: 12/12/2005, 18h29
  3. Messages Privés : reste en boite d'envoi ? Pourquoi ?
    Par Perceval dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 20/09/2005, 17h52

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