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 :

MeasureString / Measuretext parfois trop court ?


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut MeasureString / Measuretext parfois trop court ?
    Bonjour

    J'utilise un TextRender.MeasureText pour calculer la taille necessaire a l'affichage d'une chaine
    Ensuite je fais un DrawString dans un bitmap construit a l'aide des dimensions donées

    MAIS

    Je constate que pour les longues chaines (2 - 3 mots) comprenant des blancs ou des - la taille calculée est un peu trop courte.
    J'en suis donc a empiriquement évaluer la taille totale de la chaine + le nombre de blancs ou tirets pour elargir un peu la taille ?

    Mais ce n'est evidemment pas tres stable.

    Quelqu'un connait-il une solution a ce problème ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Un peu trop courte par rapport à quoi ?
    Tu as essayé la surcharge qui prend en paramètre un TextFormatFlags ? Il y a peut-être une option là-dedans qui règlerait le problème...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tomlev

    J'ai tout essayé !
    Ci-joint ma fonction que tu peux facilement tester

    Si je mets Alpes-de-Haute-Provence en arial regular 10, le e final disparait
    Si je mets Alpes-de-Haute-Provence en arial BOLD 10, le e final revient



    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
       // ***************************************************************************************
        private static Bitmap ToImage(string curStr, Font font, Color color, Color BackColor)
        {
          if (curStr == null) return null;
          if (font == null) return null;
          if (color==null) return null;
          if (BackColor == null) return null;
     
          StringFormat format = new StringFormat();
          SolidBrush LgdBrush = new SolidBrush(color);
          format.Alignment = StringAlignment.Center;
     
    //
          TextFormatFlags flags = TextFormatFlags.LeftAndRightPadding;
     
          // Declare a proposed size with dimensions set to the maximum integer value.
          Size proposedSize = new Size(int.MaxValue, int.MaxValue);
          SizeF szTxt=TextRenderer.MeasureText(curStr, font, proposedSize, flags);
     
     
     
    //
     
     
    //      SizeF szTxt = TextRenderer.MeasureText(curStr, font);
          /// petit offset pour cadre et différence ente TextRenderer.Measure et graphics.Measure
          szTxt.Width += 4;
          szTxt.Height += 2;
          // +2 pour cadre eventuel
          Bitmap bmpTxt = new Bitmap((int)szTxt.Width, (int)szTxt.Height);
          Graphics txtG = Graphics.FromImage(bmpTxt);
          txtG.SmoothingMode = SmoothingMode.AntiAlias;
     
          RectangleF cellarea = new RectangleF(0, 0, szTxt.Width, szTxt.Height);
          SolidBrush BackColorBr = new SolidBrush(Color.FromArgb(1, 255, 255, 255));
          txtG.FillRectangle(BackColorBr, cellarea);
          txtG.DrawString(curStr, font, LgdBrush, cellarea, format);
          txtG.Dispose();
          return bmpTxt;
        }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    Si je mets Alpes-de-Haute-Provence en arial regular 10, le e final disparait
    Si je mets Alpes-de-Haute-Provence en arial BOLD 10, le e final revient
    Euh... c'est pas le contraire plutôt ? En général le gras prend plus de place...

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Non non !

    C'est paradoxal mais c'est bien ca
    En fait on ne dépends pas de la place que ca va prendre mais de la maniere dont cette place est calculée et vraissemblablement en bold il y a moins d'erreur qu'en regular !

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    c'est exactement le problème que j'évoquais récemment avec toi

    Que je n'ai pas résolu non plus

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Tu as raison
    En fait dans le contexte de mon grid je ne l'avais jamais vu !

    Je vais le prendre par les cornes celui là !!

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    C'est vraiment curieux

    alpes de haute provence : manque e
    alpesdehauteprovence : manque e
    iiiiiiiiiiiiiiiiiice : (meme nombre de lettre : ca va)
    hhhhhhhhhhhhhhhhhhhce (meme nombre de lettre : manque ce)

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    En fait, si je comprends bien tu mesures le texte avec TextRenderer.MeasureText, et tu le dessines avec Graphics.DrawString ? Visiblement ils ne se comportent pas de la même manière, bizarre

    Sinon tu peux essayer de dessiner le texte avec TextRenderer.DrawText (en passant le Graphics comme premier paramètre), là on peut espérer que le rendu correspondra au calcul de la taille...

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tomlev

    En fait j'y croyais pas trop car apparement il y a plusieurs questtions sur le sujet dans differents forums sans reponse vraiment claire

    J'ai essayé ton idée mais il refuse l'overload qui ne necessite que le forcolor
    Je pense que c'est parce qu'il attends un DC et pas un graphics

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          Color cc = Color.Black;
    //      TextRenderer.DrawText(txtG,curStr, font, cellarea, cc, format);
          txtG.DrawString(curStr, font, LgdBrush, cellarea, format);

  11. #11
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Tomlev a Gagné !!


    J'y croyais pas mais tu a raison
    C'est moi qui suis bete j'avais confondu le stringformat et le textformatflag

    Voici ce que ca donne (je peux encore certainement tuner)


    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
        // ***************************************************************************************
        private static Bitmap ToImage(string curStr, Font font, Color color, Color BackColor)
        {
          if (curStr == null) return null;
          if (font == null) return null;
          if (color==null) return null;
          if (BackColor == null) return null;
     
          StringFormat format = new StringFormat();
          SolidBrush LgdBrush = new SolidBrush(color);
          format.Alignment = StringAlignment.Center;
     
    //
          TextFormatFlags flags = TextFormatFlags.LeftAndRightPadding;
     
          // Declare a proposed size with dimensions set to the maximum integer value.
          Size proposedSize = new Size(int.MaxValue, int.MaxValue);
          SizeF szTxt=TextRenderer.MeasureText(curStr, font, proposedSize, flags);
     
     
          szTxt.Width += 4;
          szTxt.Height += 2;
          // +2 pour cadre eventuel
          Bitmap bmpTxt = new Bitmap((int)szTxt.Width, (int)szTxt.Height);
          Graphics txtG = Graphics.FromImage(bmpTxt);
     
          txtG.SmoothingMode = SmoothingMode.AntiAlias;
     
          Rectangle cellarea = new Rectangle(0, 0, (int)szTxt.Width, (int)szTxt.Height);
          SolidBrush BackColorBr = new SolidBrush(Color.FromArgb(1, 255, 255, 255));
          txtG.FillRectangle(BackColorBr, cellarea);
          Color cc = Color.Black;
          TextRenderer.DrawText(txtG, curStr, font, cellarea, cc, flags);
     
    //      txtG.DrawString(curStr, font, LgdBrush, cellarea, format);
          txtG.Dispose();
          return bmpTxt;
        }

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Pas terrible
    Ca marche mais le rendering du TextRenderer est CRAPULEUX !!

    Je dirais meme inutilisable

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    Ca marche mais le rendering du TextRenderer est CRAPULEUX !!

    Je dirais meme inutilisable
    arf
    Et si tu essaies de modifier les options du graphics ? (CompositingMode, InterpolationMode, SmoothingMode, etc...)

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Avec les memes settings (SmoothingMode antialias) le Graphics.DrawString est parfait Mais le TextRenderer.Draw.... est degeu !

    Je contourne pour le moment en ajoutant un 'a' bidon a la fin du string lors du MeasureText

Discussions similaires

  1. Session trop courte
    Par tigunn dans le forum Evolutions du club
    Réponses: 5
    Dernier message: 11/08/2006, 15h35
  2. Input trop court?
    Par picsoun dans le forum Langage
    Réponses: 4
    Dernier message: 21/05/2006, 13h52
  3. [VB]Winsock - Variable trop courte ?
    Par Benji Le Magic dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 27/01/2006, 15h23
  4. [vba-excel] Le temps de fermeture trop court ?
    Par Damsou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 10h03
  5. [LINUX][INSTALL]Error de fichier trop court
    Par silvermoon dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 06/08/2004, 16h17

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