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 :

Pas de réception de message privé


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut Pas de réception de message privé
    Bonjour,

    Novice en MFC, je développe un programme de calcul comportant une version interactive dans laquelle est définie une boîte de dialogue (dérivée de CFileDialog) permettant à un utilisateur de choisir une liste de fichiers d'entrée. Pas de soucis pour cela a priori.
    A côté, mes calculs s'exécutent dans un thread à part.
    Conformément au contenu de la FAQ et aux (remarquables !) contributions de Farscape, j'essaye de définir un msg privé demandant l'affichage de cette boîte de dialogue (je dis "j'essaye" parce que, visiblement, je ne m'y prends pas bien). Pour cela, mon PostMessage s'exécute mais ma méthode de réception (définie dans ma classe héritée de CFileDialog) n'est jamais appelée.
    J'ai lu quelque part qu'il fallait absolument que la partie graphique soit développée avec le wizard de Visual pour que cela fonctionne. Est-ce exact ? Quelles peuvent être les autres causes de problème de réception de msg privé ?

    Merci d'avance pour vos contributions.

  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
    Par défaut
    salut,
    montre nous ton code, notamment ton implémentation du message privé dans le bloc BEGIN_MESSAGE_MAP

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Voici des extraits de mon code :

    Dans mon CustomFileDialog.h :
    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
    21
    22
    23
    24
    25
    26
    #define WM_TEST WM_USER+100 // ID msg privé
     
    class CCustomFileDialog : public CFileDialog
    {
    ...
    protected:
    	// virtual event overrides
    	DECLARE_MESSAGE_MAP()
    	// CFileDialog overrides
    	virtual void OnFileNameChange();
    	virtual BOOL OnFileNameOK();
    	virtual void OnFolderChange();
    	virtual void OnInitDone();
    	virtual void OnLBSelChangedNotify(UINT nIDBox, UINT iCurSel, UINT nCode);
    	virtual UINT OnShareViolation(LPCTSTR lpszPathName);
    	virtual void OnTypeChange();
     
    	// CDialog overrides
    	virtual BOOL OnInitDialog();
    	virtual void OnOK();
    	virtual void OnCancel();
    	virtual void OnSetFont(CFont *pFont);
     
    	// fonction de réponse pour le message privé
    	LRESULT OnReceivePrivateMsg(WPARAM wparam, LPARAM lparam);
    };
    Dans CustomFileDialog.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN_MESSAGE_MAP(CCustomFileDialog, CFileDialog)
    	ON_MESSAGE(WM_TEST, OnReceivePrivateMsg)  // message privé 
    END_MESSAGE_MAP()
    puis la méthode elle-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LRESULT CCustomFileDialog::OnReceivePrivateMsg(WPARAM wparam, LPARAM lparam)
    {
    	std::cout << "Reception du message OnReceivePrivateMsg" << endl;
     
    	INT_PTR nResponse = this->DoModal(); // la boite de dlg a déjà été créée avant le lancement du thread de calcul
     
    	return 0L;
    }
    Dans ma classe surchargeant un CWinThread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // Envoi du msg privé
    ::PostMessage(HWND_BROADCAST, WM_TEST, (WPARAM)NULL, (LPARAM)NULL) ;
    Merci d'avance !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Tu ne peux pas recevoir un message tant que la fenêtre/boîte de dialogue n'existe pas en tant que telle.
    Donc, une boîte de dialogue ne peut pas recevoir de message avant son DoModal()...
    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.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    OK mais si j'ajoute le DoModal() après la création de la boîte de dialogue, elle s'affiche aussitôt.

    Or, je souhaite que son affichage soit déclenché par la réception du msg privé, i.e. soit commandé par une certaine action dans le thread qui tourne à côté. En effet, cette boîte ne doit pas systématiquement s'afficher dans mon appli.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Ça se mord la queue.
    Je pense que tu ne mets pas le code de réception du message dans la bonne classe. Si tu veux recevoir un message avant que la boîte de dialogue modale soit affichée, tu dois mettre la réception du message dans le code de la classe de la fenêtre parente, qui appellera le DoModal.
    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.

  7. #7
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    ou alors utiliser un Thread Message. C'est un message qui est réceptionné par le thread et non par une fenetre, dans le cas où il n'y a pas de fenetre à l'écran.

    tout doit se faire dans la classe dérivée de CWinApp

    voir CWinApp:: PostThreadMessage() et ON_THREAD_MESSAGE()

    @+

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Une solution est alors de faire ton DoModal, mais dans le OnInitDialog de masquer la fenêtre (qqchose comme ShowWindow(SW_HIDE)).

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Sauf que le DoModal() désactive la fenêtre parente...
    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
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Sur le conseil de Médinoc, j'essaye de déplacer le code de réception de mon msg privé dans une autre classe, en l'occurrence la classe d'application.

    Mais je bute sur un pb de compil :
    FileDlgWatcher.cpp(20) : error C2440: 'static_cast' : impossible de convertir de 'LRESULT (__thiscall CFileDlgWatcherApp::* )(WPARAM,LPARAM)' en 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
    Aucune fonction ayant ce nom dans la portée ne correspond au type de la cible

    En cherchant sur le Net, je trouve des tas de référence à cette erreur mais il me semble que mon prototype est correct :
    afx_msg LRESULT OnReceivePrivateMessage(WPARAM wparam, LPARAM lparam);

    Le problème que je soupçonne, c'est que cela pose un problème de déplacer ce code dans la classe d'application (qui dérive de CWinApp et non de CWnd). Non ?
    En fait, je voulais faire au plus vite (et au plus court) ma boîte de dialogue car c'était la seule partie graphique de l'application ... Suis-je obligé de mettre en place toutes les classes Doc, View, etc ? N'y a t-il pas plus simple pour une pauvre boîte de dialogue (que je ne suis pas fichu d'afficher comme il faut ... )

    Merci ...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 10
    Par défaut
    Pour information, je n'ai pas réussi à faire fonctionner cette méthode de réception d'un msg privé dans ma classe d'application. ???
    Du coup, j'ai déplacé une partie du travail effectué avant dans le thread afin de faire toutes les initialisations et les affichages graphiques à partir de ma classe d'application. Le thread ne fait que du calcul pur et dur, c'est sans doute mieux ainsi et cela me permet de contourner ce pb de msg privé.

    Merci pour vos contributions.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/08/2007, 06h19
  2. [phpBB] Messages privés pas vraiment privés
    Par bibou29 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 17/01/2007, 19h00
  3. réception des messages WM_PAINT
    Par enzoMetz dans le forum Windows
    Réponses: 2
    Dernier message: 19/06/2004, 20h15

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