2010-12-10 32 views
0

Je travaille sur la création d'une application qui affichera des données JSON dans un paragraphe bien formaté. Les données JSON ont des choses comme un titre, un sous-titre, un corps, etc. Dans le corps il peut y avoir des liens (que j'ai juste besoin d'afficher en bleu et soulignés) Et c'est là que j'ai des problèmes.Graphics.DrawString modification de police en ligne C#

Le programme est basé sur le .net Compact Framework et je ne reçois qu'un objet Graphics avec l'objet JSON (et un rectangle, une police, une couleur). Y at-il de toute façon de bien dessiner une chaîne de texte avec tous les liens modifiés à la couleur/police différente? Mes pensées ont été de dessiner chaque mot individuel et de simplement changer la police juste au moment où le mot se lève. Cela semble très inefficace. Y a-t-il un meilleur moyen?

Merci :)

Oh, p.s. S'il existe un moyen facile de déterminer la hauteur correcte du rectangle dans la méthode DrawString, afin qu'aucun texte ne soit coupé, cela serait également très utile!

MISE À JOUR: J'ai compris mon P.S. question :) http://www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html

+0

Est-ce une application WinForms sur le cadre compact? Si non, pouvez-vous nous en dire plus sur l'application? – Bryan

+0

Oui, il s'agit d'une application WinForms sur le cadre compact. C'est en fait un nouveau client Facebook :) Je l'ai développé sur XDA-Developers depuis quelques mois maintenant. http://forum.xda-developers.com/showthread.php?t=630992 –

Répondre

0

Ok, ce que j'ai fini par faire est d'ajouter une méthode de dessin personnalisée avec des objets spéciaux "Word". L'objet Word contient une chaîne, une couleur et un pointeur sur une police. J'analysé le texte dans un dictionnaire d'objets Word, puis mis en boucle à travers tous les objets et dessiné le texte avec le code suivant sudo

int maxWidth = Width 
int curX = 0 
int curY = 0 

foreach word in words 
    if curX > 0 
     word = DrawWordUntilWidth(out curX, out curY, word, maxWidth) 

    if word != null 
     DrawWord(out curX, out curY, word, maxWidth) 

DrawWordUntilWidth va Mesuré mots word (deliminated par des espaces et « - ») jusqu'à ce que curX > maxWidth puis dessinez les mots qui correspondent, trunc la chaîne dans le mot, définissez curX à 0, définissez curY += maxWordHeight étant la hauteur maximale des polices utilisées sur cette ligne. Si tous les mots de word sont utilisés, null est renvoyé, sinon le mot tronqué est renvoyé.

DrawWordDrawWord est très similaire mais part du principe que curX est toujours = 0, donc il peut dessiner toute la chaîne, puis régler curX et curY en conséquence.

Cela fonctionne très bien, car il y a peu d'études et il rend assez bien. Si quelqu'un a une meilleure solution, s'il vous plaît faites le moi savoir!