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

C++ Discussion :

Écrire dans une fenêtre à partir d'une fonction


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut Écrire dans une fenêtre à partir d'une fonction
    Bonjour, comme le dit le titre, j'aimerais écrire dans une fenêtre à partir d'une fonction, c'est à dire, sans passer par WM_PAINT. Est-ce possible?

    Si quelqu'un a une solution quelconque, n'hésitez pas!

    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    La possibilité, oui, surement, mais il faudra expliquer plus en détail ce que vous souhaitez faire afin d'avoir une réponse précise.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Bonjour, en fait, je veut marquer "Nombre de résultats : " suivi de la variable(un entier) "leNombre" dans ma fenêtre. Ce code doit ce trouver dans une fonction, et donc, pas dans WM_PAINT. J'ai essayé d'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HDC hDC;
    	HWND hWnd;
     	hDC = GetWindowDC(hWnd);
     	PAINTSTRUCT Ps;
    	hDC=BeginPaint(hWnd,&Ps);
            TextOut (hDC, 255, 255,"Nombre de résultats : ", strlen("Nombre de résultats : "));
    	TextOut (hDC, 255, 255,leNombre, strlen(leNombre));
    	EndPaint(hWnd, &Ps);
    Mais la phrase ne s'affiche pas, et leNombre est un entier alors que TextOut() demande un const char*(ne vous en faites pas, je sais comment résoudre ce problème).
    Je doit mettre le code dans une fonction, car leNombre est initialisé dans cette fonction.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    Je ne sais pas si ça peut marcher, mais en tout cas, il faut que tu dises à Windows que ta fenêtre doit être redessinée.
    C'est possible avec la fonction Invalidate, ou plus violent UpdateWindow
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Comment marche ces fonctions s'il te plait? Je ne suis pas très fort.

  6. #6
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    MSDN : UpdateWindow
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Merci pour cette réponse, mais il n'y a quand-même rien qui s'affiche avec UpdateWindow() et avec Invalidate() !

  8. #8
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 045
    Points : 11 368
    Points
    11 368
    Billets dans le blog
    10
    Par défaut
    As-tu essayé avec un ClientDC plutôt qu'avec un PaintDC (ce que tu fais actuellement) ? (regarde la doc MSDN pour les questions que tu te poses déjà sur ClientDC)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    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 518
    Points
    41 518
    Par défaut
    Ce que tu dois faire pour tricher ainsi, c'est invalider la zone où tu veux écrire avant de faire ton écriture forcée.

    Sinon, tu gardes ton code d'écriture dans le traitement du WM_PAINT, et tu l'invoques avec un InvalidateRect()+UpdateWindow() (ou un RedrawWindow() avec les bons paramètres, ça devrait faire la même chose).

    Edit: RedrawWindow avec les bons paramètres, ça doit ressembler à ceci si tu veux redessiner toute la fenêtre:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW);
    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
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par simac Voir le message
    Merci pour cette réponse, mais il n'y a quand-même rien qui s'affiche avec UpdateWindow() et avec Invalidate() !
    Ces deux fonctions forcent l'envoi d'un message WM_PAINT - rien d'autre.

    Quelle est la valeur de ton hwnd ? Parce faire un GetWindowDC(hwnd) c'est bien sympa, mais il faut que le hwnd soit valide - sinon le HDC obtenu est NULL.

    Il y a aussi le fait que BeginPaint() ne peut être appelé qu'en réponse à un message WM_PAINT (lire : si tu l'appelle en dehors du handler de WM_PAINT, ça ne marchera pas ; cf. http://msdn.microsoft.com/en-us/libr...v=vs.85).aspx). En dehors de WM_PAINT, tu n'a pas besoin de faire un BeginPaint(), tu peux directement dessiner sur le HDC dès lors que celui-ci est valide.

    Accessoirement, tester les codes de retour des fonctions permet de mieux comprendre les erreurs de logique de son propre code. Je te conseille de le faire.

    Et pour créer une chaîne qui va contenir tout ce que tu souhaite afficher, utilise std::stringstream (http://www.cplusplus.com/reference/s.../stringstream/) (oui, je sais, tu as une méthode pour parvenir à tes fins ; ce qui reviens probablement à refaire une conversion int -> chaine ; ce qui est déjà fait par std::stringstream).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Comment fait-on pour récupérer la valeur d'un hwnd?

  12. #12
    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 518
    Points
    41 518
    Par défaut
    Ça dépend, c'est la HWND de quoi que tu cherches? Celui de ta propre fenêtre? Celui d'un des contrôles dans la fenêtre? etc.
    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.

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Bonjour, c'est l'HWND de ma fenêtre.

  14. #14
    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 518
    Points
    41 518
    Par défaut
    Ben tu l'as déjà... Il est retourné par CreateWindow() et reçu en paramètre de ta WNDPROC...
    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.

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    D'accord, merci .

    En dehors de WM_PAINT, tu n'a pas besoin de faire un BeginPaint(), tu peux directement dessiner sur le HDC dès lors que celui-ci est valide.
    Quelle est donc l'instruction pour dessiner sur le HDC?

  16. #16
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par simac Voir le message
    D'accord, merci .



    Quelle est donc l'instruction pour dessiner sur le HDC?
    Euh... TextOut(), ... Toutes les fonctions qui prennent un HDC en paramètre et qui, d'après leur nom, dessine quelque chose. Le dessin, sous Windows, c'est assez large...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    bool ma_fonction_de_dessin(HWND hwnd)
    {
        HDC hdc = GetDC(hwnd);
        if (!hdc)
            return false;
     
        // toute fonction de dessin utile...
     
        // OBLIGATOIRE : faire un release du HDC, parce que sans ça, quelqu'un va crier fort.
        ReleaseDC(hwnd, hdc);
     
        return true;
    }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  17. #17
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 81
    Points : 50
    Points
    50
    Par défaut
    Merci pour toutes vos réponses!!! Ça marche!!

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

Discussions similaires

  1. ouvrir une fenêtre à partir d'une autre
    Par zikos dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 20/05/2008, 04h42
  2. [Débutant] Afficher une fenêtre à partir d'une autre fenêtre
    Par fifou91 dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 15/12/2007, 12h15
  3. Réponses: 1
    Dernier message: 21/11/2007, 21h53
  4. Ouvrir une fenêtre à partir d'une Popup
    Par Sytchev3 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/10/2007, 11h46
  5. Réponses: 20
    Dernier message: 10/05/2006, 11h26

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