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

Windows Discussion :

WM_USER et pointeur


Sujet :

Windows

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut WM_USER et pointeur
    Bonjour,

    Je voudrais envoyer des messages personnalisés à ma fenetre, pour des actions personnalisées à partir de controles.... personalisés !

    Donc, je vais envoyer des messages WM_USER avec PostMessage pour avoir un traitement lors de la prochaine boucle de message.

    Ma fenetre principale (celle qui va recevoir les WM_USER) est créée avec CreateWindow.

    Jusque là pas d'incohérence ? (y'a des subtilités que je connait pas)

    Ce que je me demande surtout, c'est si je peux passer des pointeurs vers des données a moi en parametre du message ?

    Lors du traitement du message, y'a pas de risque que la donnée pointée soit détruite, puisque la donnée pointée est une instance d'un objet créé dans la fenetre, donc tant que la fenetre est là (et traite les message) les données existent, non ?

    Les membres wParam et lParam ont une taille suffisante pour recevoir des pointeurs ? Meme sous Vista ou avec des pointeurs 64bits ?

    Merci !

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    salut,

    j'ai eu ce probleme lorsque j'ai voulu, a partir d'un thread secondaire, envoyer un message a ma tahce principale.

    voila comment j'ai fait :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    /**
     * @brief Envoyer un message a la tache principale
     * @param id L'identifiant du message
     * @param donnees Pointeur vers les donnees optionnelles
     * @param ev L'evenement optionel
     */
    void
    InterfaceApplication::envoyerMessageTachePrincipale(ulong id, void* donnees, Evenement* ev)
    {
    #if defined MACOSX
      EventRef event;
      CreateEvent(0, s_event_class_application, s_event_kind_message, 0, kEventAttributeNone, &event);
    
      SetEventParameter(event, 'Mess', typeUInt32, sizeof(ulong), &id);
      SetEventParameter(event, 'Donn', typeUInt32, sizeof(void*), &donnees);
      SetEventParameter(event, 'Even', typeUInt32, sizeof(Evenement*), &ev);
    
      PostEventToQueue(GetMainEventQueue(),event,kEventPriorityHigh);
    #elif defined WINDOWS
      SendNotifyMessage(m_fenetre_menu_hdl,WM_USER + id,(WPARAM)donnees,(LPARAM)ev);
    #endif
    }
    
    /**
     * @brief Callback de fenetre pour le menu (evenements lies aux raccourcis claviers, au menu et point d'entree des messages pour la tache principale)
     */
    LRESULT CALLBACK
    InterfaceApplication::menuProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
      // on recupere un pointeur vers l'objet telecommande grace au handle de la fenetre
      InterfaceApplication* iapp = (InterfaceApplication*) GetWindowLongA(hwnd,GWL_USERDATA);
      if (message > WM_USER)
      {
        message -= WM_USER;
        iapp->m_application->envoyerMessage(message, (void*)wParam);
        Evenement* ev = (Evenement*) lParam;
        if (ev) // on signale si demande
          ev->signaler();
        return 0;
      }
    (...)
    }
    A savoir m_fenetre_menu_hdl est un HWND et menuproc est sa callback.
    Il y a un petit bout de code MAC mais tu l'oublies.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Ok, nickel !

    Le fait d'envoyer des pointeurs en parametre ne pose donc pas de probleme (pointeurs 64 bits ou 32 bits tronqués à 32 bits ou à 16 bits) ?

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Pour Vista en revanche je ne sais pas. Peut-etre Medinoc ou Laurent Gomila t'en diront plus.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Les types WPARAM et LPARAM sont respectivement des typedefs sur UINT_PTR et LONG_PTR, il n'y a donc aucun problème.
    Pareil pour le type de retour LRESULT, d'ailleurs.
    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.

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Nickel !

    Merci pour l'info

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

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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