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 :

Message dans WM_PAINT


Sujet :

Windows

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 528
    Points : 217
    Points
    217
    Par défaut Message dans WM_PAINT
    Bonjour,
    Peut on loger dans le WM_PAINT un "SendMessage" (pour ouvrir une seconde fenetre) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ..........
    ...............
    EndPaint (hwnd, &ps) ;
                if (!affichage && top_mise_jour) {
                  affichage++;
                  SendMessage (hwnd, WM_COMMAND, IDM_MISAJOUR, 0L); 
    			}
    	        return 0;
    et dans IDM_MISAJOUR appeler la fenetre de commande de mise a jour ...
    Est ce correct ?
    Merci

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: Message dans WM_PAINT
    Bonjour,
    Citation Envoyé par dede92
    Bonjour,
    Peut on loger dans le WM_PAINT un "SendMessage" (pour ouvrir une seconde fenetre) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ..........
    ...............
    EndPaint (hwnd, &ps) ;
                if (!affichage && top_mise_jour) {
                  affichage++;
                  SendMessage (hwnd, WM_COMMAND, IDM_MISAJOUR, 0L); 
    			}
    	        return 0;
    et dans IDM_MISAJOUR appeler la fenetre de commande de mise a jour ...
    Est ce correct ?
    Merci
    Bah oui tant que ça marche tu peut!
    Par contre, le problème c'est que tu risque de tourné en rond:
    1. appel à WM_PAINT pour une raison quelconque,
    2. Affichage de la boite de dialogue,
    3. destruction de la boite de dialogue,
    4. Envoi du message WM_PAINT pour rafraichir la zone cachée par la boite de dialogue,
    5. ...

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Peut on loger dans le WM_PAINT un "SendMessage" (pour ouvrir une seconde fenetre) ?

    Tu n'as rien compris à l'utilisation de WM_PAINT !
    Excuse-moi d'être arrogant mais il faut piger les méchanismes win32.

    WM_PAINT sert EXCLUSIVEMENT à repaindre l'écran en étant invoqué par Invalidate

    Par exemple si tu effectues des tracés graphiques à l'écran ( lignes , bitmaps etc...)
    L'ouverture d'une fenêtre NE S'EFFECTUE JAMAIS sur le rafraichissement graphique d'une autre ; c'est , excuse-moi n'importe quoi comme programmation.

    L'ouverture d'une autre fenêtre s'effectue en général sur la pression d'un bouton ou bien entrée menu !

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 528
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par mat.M
    Tu n'as rien compris à l'utilisation de WM_PAINT !
    Excuse-moi d'être arrogant mais il faut piger les méchanismes win32.
    L'ouverture d'une autre fenêtre s'effectue en général sur la pression d'un bouton ou bien entrée menu !
    L'ouverture d'une fenetre par un clic dans un menu, c'est la même chose que d'envoyer un message dans la file d'attente pour WM_COMMAND !!!
    Quant à l'utilisation de WM_PAINT, merci .... je pense que j'ai saisi.
    Dans mon cas j'ai besoin d'afficher un dialogue qui conditionne l'utilisation de l'appli entre le moment où la fenetre principale est crée et le moment où elle est affichée et a ce moment là seulement.

  5. #5
    Membre habitué Avatar de ken_le_videur
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 129
    Points : 145
    Points
    145
    Par défaut
    Je conseillerais de mettre un PostMessage à la place du SendMessage pour éviter de figer si l'autre fenêtre met du temps à répondre

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    L'ouverture d'une fenetre par un clic dans un menu, c'est la même chose que d'envoyer un message dans la file d'attente pour WM_COMMAND !!!
    Quant à l'utilisation de WM_PAINT, merci .... je pense que j'ai saisi.
    Dans mon cas j'ai besoin d'afficher un dialogue qui conditionne l'utilisation de l'appli entre le moment où la fenetre principale est crée et le moment où elle est affichée et a ce moment là seulement.
    Le problème c'est que le message WM_PAINT, est envoyé à ta fenêtre à chaque fois qu'elle doit être redessinée. Imagines une boîte de dialogue que tu bouges dans tous les sens devant ta fenêtre et tu reçois alors 1500000 message WM_PAINT. Donc ton sendmessage va s'effectuer 1500000 fois.

    Est-ce que c'est vraiment ce que tu veux?

    Sinon lorsque une fenêtre est créée, tu as le message WM_CREATE mais qui lui n'est envoyé qu'une seule fois à la création de la fenêtre.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 528
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par moldavi
    Le problème c'est que le message WM_PAINT, est envoyé à ta fenêtre à chaque fois qu'elle doit être redessinée. Imagines une boîte de dialogue que tu bouges dans tous les sens devant ta fenêtre et tu reçois alors 1500000 message WM_PAINT. Donc ton sendmessage va s'effectuer 1500000 fois.
    Je suis d'accord aves toi, excepté le fait que j'ai un indicateur (static int affichage declaré static, qui n'autorise le SendMessage qu'une fois ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (!affichage && top_mise_jour) {
                  affichage++;
                  SendMessage (hwnd, WM_COMMAND, IDM_MISAJOUR, 0L);

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    A mon avis il y a un problème de conception:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!affichage && top_mise_jour)
    Tu vas effectuer ce test à chaque message WM_PAINT, alors qu'il n'est utile qu'une seule fois. Je suis sur que tu peux faire autrement.

    As-tu regardé WM_CREATE?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 528
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par moldavi
    A mon avis il y a un problème de conception:

    As-tu regardé WM_CREATE?
    Oui effectivement, si on prend le concept, ce serait sa place, mais dans ce cas là, j'ai le dialogue avant l'affichage de la fenetre principale !!!
    Il ne passera la main au message WM_PAINT qu'une fois le dilogue terminé.
    Alors il y a peut etre moyen de faire autrement ...

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Je ne comprends pas ton problème : WM_CREATE comme a indiqué Moldavi ou WM_INITDIALOG c'est très bien ;

  11. #11
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Oui effectivement, si on prend le concept, ce serait sa place, mais dans ce cas là, j'ai le dialogue avant l'affichage de la fenetre principale !!!
    Ben dans ce cas, affiche ta boîte de dialogue après que tu fasses le premier update:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
    
      hWnd = CreateWindows...blabla...
    
      ShowWindow(hWnd, SW_SHOWNORMAL);
      UpdateWindow(m_hWnd);
    
      MaBoiteDeDialogue();
    
      while(GetMessage(&msg, NULL, 0, 0) > 0){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
      }
       ...

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Points : 73
    Points
    73
    Par défaut
    Envoie ton message (WM_COMMAND-IDM_MISAJOUR) à la réception de WM_CREATE, mais avec PostMessage() et non pas SendMessage(). De cette façon, ton application le recevra après l'apparition de la fenêtre.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    528
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 528
    Points : 217
    Points
    217
    Par défaut
    Citation Envoyé par axile
    Envoie ton message (WM_COMMAND-IDM_MISAJOUR) à la réception de WM_CREATE, mais avec PostMessage() et non pas SendMessage(). De cette façon, ton application le recevra après l'apparition de la fenêtre.
    C'est bon, ces deux dernières solutions sont corretes et sont tout à fait appropriées à mon problème.
    Merci à tous.

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

Discussions similaires

  1. [Exception]Affichage de message dans une Execption
    Par harris_macken dans le forum Général Java
    Réponses: 8
    Dernier message: 29/05/2005, 17h34
  2. [débutant]Affiché un message dans l'émulateur.
    Par rvfranck dans le forum Java ME
    Réponses: 3
    Dernier message: 02/04/2005, 15h41
  3. Création de son propre message dans un formulaire
    Par androme dans le forum C++Builder
    Réponses: 17
    Dernier message: 06/02/2005, 23h13
  4. [Info] Message dans console
    Par coilolo dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 08/07/2004, 14h59

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