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

Visual C++ Discussion :

Imprimer des sauts de ligne en VC++6


Sujet :

Visual C++

  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut Imprimer des sauts de ligne en VC++6
    Bonjour,

    J'ai suivi le tutoriel de developpez.com pour imprimer, mais j'ai quand même quelques petits soucis:
    Si je laisse la fonte par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CGdiObject* pOldFont = dcPrinter.SelectStockObject(SYSTEM_FONT);
    le texte que j'imprime (sur une IBM Infoprint 21) sont minuscules.
    Si j'utilise la fonte "DEVICE_DEFAULT_FONT" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CGdiObject* pOldFont = dcPrinter.SelectStockObject(DEVICE_DEFAULT_FONT);
    la taille des caractères est correcte, mais les lignes sont écrasées (une sur l'autre) alors que je fais des sauts de ligne avec \r\n :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dcPrinter.TextOut(50, 50, (const _TCHAR *) "Mon texte\r\nsur deux lignes", 28 );
    Mon texte s'affiche bien sur deux lignes, mais presque entièrement superposées, comme si l'interligne correspondait à celui de la fonte initiale.

    Quelqu'un aurait-il une explication/un remède ?

    Merci

  2. #2
    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
    Essaie peut-être DrawText() au lieu de TextOut()...
    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.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Merci pour le conseil, mais je débute totalement en utilisateur de l'API Windows, et je ne trouve pas d'exemple d'utilisation de DrawText().
    Le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RECT Rect;
    Rect.left = 0;
    Rect.top = 0;
    Rect.right = dcPrinter.GetDeviceCaps(HORZRES);
    Rect.bottom = dcPrinter.GetDeviceCaps(VERTRES);
     
    dcPrinter.DrawText( "Mon texte\r\nsur deux lignes", 28, &Rect, DT_CALCRECT | DT_WORDBREAK | DT_EXPANDTABS);
    ... me donne une page vierge. Où est l'erreur ?

    Merci !

  4. #4
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    bonjour
    essaye d'abord ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    RECT Rect;
    Rect.left = 0;
    Rect.top = 0;
    Rect.right = dcPrinter.GetDeviceCaps(HORZSIZE);
    Rect.bottom = dcPrinter.GetDeviceCaps(VERTSIZE);
    dcPrinter.DrawText( "Mon texte\r\nsur deux lignes", 28, CRect(0,0,200,200), DT_LEFT );

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Il y a une très nette amélioration : La sortie sur l'imprimante est la suivante :
    Mon
    sur


  6. #6
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Maintennat augmente le x en remplaçant par CRect(0,0,600,200);

  7. #7
    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
    Et si tu passes Rect au lieu d'un CRect de 200*200 ?
    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.

  8. #8
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Alors là !

    En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CRect Rect(0,0,dcPrinter.GetDeviceCaps(HORZRES),dcPrinter.GetDeviceCaps(VERTRES));
     
    dcPrinter.DrawText( "Mon texte\r\nsur deux lignes", 28, &Rect, DT_LEFT);
    J'ai exactement ce que j'attendais !

    Merci (mais j'aimerais bien comprendre la différence quand même)

  9. #9
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut Bonjour
    On est sur MFC,

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    ???

    en tous cas, merci pour votre aide !

  11. #11
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut Bonjour
    salut,
    voila quand on fait GetDeviceCaps(VERTSIZE) on récupère la hauteur physique du dispositif d'affichage (ie: imprimante) idem pour HORZSIZE
    Pour les autres VERTRES .. je les utilise pas puisque'il donnent pas le meme resultat

    l'interret d'avoir a utiliser VERTSIZE est que la valeur recupéré est la hauteur physique du dispositif d'affichage pour ne pas avoir de problème quand on change d'imprimante

  12. #12
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    J'ai bien compris l'intérêt d'utiliser GetDeviceCaps(VERTSIZE) et GetDeviceCaps(HORZSIZE), mais ce que je ne comprends pas, c'est la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    RECT Rect;
    Rect.left = 0;
    Rect.top = 0;
    Rect.right = dcPrinter.GetDeviceCaps(HORZRES);
    Rect.bottom = dcPrinter.GetDeviceCaps(VERTRES);
     
    dcPrinter.DrawText( "Mon texte\r\nsur deux lignes", 28, &Rect, DT_CALCRECT | DT_WORDBREAK | DT_EXPANDTABS);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CRect Rect(0,0,dcPrinter.GetDeviceCaps(HORZRES),dcPrinter.GetDeviceCaps(VERTRES));
     
    dcPrinter.DrawText( "Mon texte\r\nsur deux lignes", 28, &Rect, DT_LEFT);
    A moins que ça ne vienne des flags DT_CALCRECT DT_WORDBREAK et DT_EXPANDTABS ?

  13. #13
    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
    Déjà, DT_CALCRECT ne sert pas à ça, et empêche carrément que le texte soit dessiné...
    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.

  14. #14
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Cette explication me plait mieux ... mais j'ai rien compris en lisant l'aide de MSDN, dans ce cas

  15. #15
    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
    DT_CALCRECT sert à t'indiquer la taille qu'aura le texte.

    Exemple: Si tu veux dessiner du texte dans un rectangle possédant une largeur maximale (par exemple, dessiner un cadre autour de ton texte), tu vas devoir faire ainsi:
    • Appeler GetTextExtentPoint32() pour connaître la largeur que le texte prendrait sur une seule ligne: Si c'est inférieur à la largeur du rectangle, tu peux directement écrire ton texte en une ligne et dimensionner ton rectangle à la taille du texte.
    • Sinon, appeler DrawText() avec DT_CALCRECT pour connaître la hauteur du rectangle: Tu connais déjà la largeur, c'est la largeur maximale
    • Enfin, dessiner pour de bon avec DrawText() sans le flag DT_CALCRECT.
    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.

  16. #16
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par défaut
    Merci, je dormirai moins bête ce soir.

    Par contre, je vais m'inscrire à des cours d'anglais, ce n'est pas la première fois que j'interprète de travers la prose de MSDN ...

  17. #17
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    [QUOTE=_bat13_;3707299]J'ai bien compris l'intérêt d'utiliser GetDeviceCaps(VERTSIZE) et GetDeviceCaps(HORZSIZE),
    CRect Rect(0,0,dcPrinter.GetDeviceCaps(HORZRES),dcPrinter.GetDeviceCaps(VERTRES));
    [QUOTE]
    HORZSIZE c'est en milimetres
    VERTRES c'est en pixel

    les parametres commançant par DT_.. j'en connais quelques uns:

    DT_RIGHT : allignement a droite du text
    DT_LEFT : allignement a gauche du text
    DT_CENTER : allignement au centre de CRect
    DT_VCENTER : allignement au centre (V comme Vertical) allignement vertical sans oublier d'ajouter DT_SINGLELINE

    c'est les plus interressant

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

Discussions similaires

  1. [php] Affichage des sauts de ligne </br>
    Par Flushovsky dans le forum Langage
    Réponses: 3
    Dernier message: 21/12/2005, 15h51
  2. Réponses: 13
    Dernier message: 03/12/2005, 17h09
  3. [MySQL] Formulaire php + bdd = perte des sauts de ligne html ?
    Par sunshine33 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/10/2005, 11h19
  4. insérer des sauts de lignes en fonction du navigateur
    Par remi59 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/08/2005, 19h15
  5. remplacer des sauts de ligne par '\n'
    Par Miksimus dans le forum Général Python
    Réponses: 5
    Dernier message: 18/07/2005, 10h01

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