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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 395
    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 395
    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 395
    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 395
    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.

+ 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