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 :

problème SendMessage en utilisant ON_MESSAGE


Sujet :

MFC

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut problème SendMessage en utilisant ON_MESSAGE
    Bonjour,
    Je rencontre actuellement 1 problème pour la transmission de message sous MFC.
    En effet, jusque là, je réussissais à transmettre des messages via ON_COMMAND. Mais, maintenant j'ai besoin d'envoyer "des paramètres" avec les messages.
    ON_COMMAND ne me permet pas de faire ça puisque la fonction de traitement du message doit être de type AFX_PMSG (c à d : void (void) )
    En essayant d'utiliser ON_MESSAGE dans un premier temps sans les parametres, le message n'est pas réceptionné, pas de pb de compilation, c'est juste que tout se passe comme si le message n'était pas envoyé ou reçu.
    J'ai une classe CFormView principal Ctest_windowView qui est composé d'un unique boutton, lorsqu'on appuie sur ce boutton, il y a une série de traitement (dont l'ouverture d'une fenetre CDialog nommé plog) puis un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::SendMessage(HWND_BROADCAST,ID_PROGLOG,(WPARAM)0,(LPARAM)0);
    Voici mon code:
    Dans Ressource.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define ID_PROGLOG (WM_APP+1)
    Dans plog.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    afx_msg LRESULT test2(WPARAM wParam, LPARAM lParam);
    	DECLARE_MESSAGE_MAP()
    Dans plog.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN_MESSAGE_MAP(plog, CDialog)
    	ON_BN_CLICKED(IDOK, &plog::OnBnClickedOk)
    	ON_MESSAGE(ID_PROGLOG, & plog::test2)
    END_MESSAGE_MAP()
     
    LRESULT plog::test2(WPARAM wParam, LPARAM lParam){
    UpdateData(TRUE); //cette mise a jour n'a pas lieu
    	return 0;
    }

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    qui ne reçoit pas le message ? la dialogue ?
    Sendmessage est envoyé de la formview ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Oui, c'est la dialogue qui ne reçoit pas de message.
    Oui, le message est envoyé à travers SendMessage depuis la CFormView

  4. #4
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    hé bien ce n'est pas trop étonnant ...,
    tu envoies un sendmessage à une fenêtre qui n'existe pas si j'ai bien compris l'enchainement .
    je ne vois pas trop le but de tout ça pour faire un updateData.
    celui-ci pouvant être fait dans OnInitDialog de la dialogue.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Salut,
    A vrai dire, la dialogue, je l'ai créé en ressource (je ne l'ai pas créé dans le code). Elle contient une barre de progression entre autre.
    Dans mon code, j'ai
    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
    17
    18
    19
    20
     
    plog pl; //Ceci étant la déclaration de la dialog
    puis:
    #pragma omp parallel
    {
    #pragma omp master
    {
    pl.DoModal(); 
    }
    #pragma omp sections
    {
    #pragma omp section
    {
    //Ici je fais une série de calcul dont les resultats sont affichés sur la dialog
    //puis je fais périodiquement SendMessage histoire de mettre à jour les 
    //données sur la dialog
     
    }
    }
    }
    Pour le multi-threading, il n'y a pas de souci vu que ça marchait très bien avec ON_COMMAND.
    Pour ce qui est de OnInitDialog(), elle n'a pas été généré automatiquement dans mon code (pour que je puisse la compléter), elle aurait pu me servir pour pas mal de choses. Est-ce que je pourrais l'ajouter dans ma classe CDialog: plog? Si oui, comment ? Ne faudra t-il pas ajouter des commandes supplémentaires pour cet effet ?

    Merci d'avance

  6. #6
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    pour ajouter cette méthode dans ta classe dialogue utilise l'assistant qui le fait pour toi ...
    dans le cas d'une dialogue c'est juste une méthode virtuelle il n'y pas de message:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual BOOL OnInitDialog();

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Merci pour le tuyau, ça m'a facilité pas mal de choses dans mon programme.
    Sinon, j'ai finalement résolu le pb pour ceux que ça intéresserait:
    Pour moi c'était le HWND_BROADCAST qui bloquait, il fallait le remplacer par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FindWindow(NULL,"Progression"); //"Progression" étant la caption de ma 
    //dialog
    Ce qui donne alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ::SendMessage(FindWindow(NULL,"Progression"),ID_PROGLOG,(WPARAM)0,(LPARAM)0);
    Sinon pour les param, pour les intéressés: il faut créer une struct avec tout les params qu'on veut de tt type.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct s{int i, string str;}maStruct;
    et l'envoyer via lParam:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    maStruct* pInstance=new (maStruct);
    pInstance->i=2;
    pInstance->s="test";
    ::SendMessage(FindWindow(NULL,"Progression"),ID_PROGTEST,(WPARAM)0,(LPARAM)pInstance);
    A la réception, dans le handler, LRESULT handler(WPARAM, LPARAM lParam), il faudra faire un cast du lParam en maStruct*
    Voila pour l'exemple au cas ou !
    En tout cas, merci bcp FarScape pour ton aide!

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

Discussions similaires

  1. Problème avec l'utilisation de LogMessage
    Par vanquish dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 17/11/2005, 10h18
  2. Problème avec l'utilisation d'un module
    Par goblin dans le forum Modules
    Réponses: 4
    Dernier message: 09/11/2005, 20h55
  3. Problème avec l'utilisation de librairies
    Par Aradesh dans le forum MFC
    Réponses: 3
    Dernier message: 01/08/2005, 15h00
  4. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  5. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27

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