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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 397
    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 397
    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