2015-12-08 1 views
0

J'utilise dessin personnalisé pour dessiner une chaîne dans une application WinForms. La méthode classique Graphics.DrawString est utilisé pour que:Graphics.DrawString: compte le nombre de caractères entièrement affiché dans le rectangle efficacement

g.DrawString(text, font, brush, rect, stringFormat); 

La chaîne de sortie text peut être coupée par le rectangle rect, et je dois compter le nombre de caractères entièrement visibles dans rect. Comment faire cela en utilisant les outils intégrés .NET Framework?

Veuillez ne pas suggérer d'utiliser d'autres méthodes pour envoyer du texte. J'ai besoin de résoudre cette tâche pour GDI + Graphics.DrawString.


MISE À JOUR: Oui, bien sûr, je peux utiliser Graphics.MeasureString dans une boucle dans laquelle je résume la largeur de chaque caractère depuis le début de la chaîne, mais je dois quelque chose de plus efficace comme le drapeau DT_MODIFYSTRING dans le WinAPI DrawText fonction.

Ajoutez à cela que Graphics.MeasureString ne calcule pas correctement la largeur requise. Pour de plus d'informations, consultez cet article:

http://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations

+0

Connaissez-vous Graphics.MeasureString? https://msdn.microsoft.com/en-us/library/6xe5hazb(v=vs.110).aspx – Biscuits

+0

@Biscuits, connaissez-vous les problèmes liés à Graphics.MeasureString? Voir, par exemple, [this] (http://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations). Il semble que nous devons utiliser [StringFormat.SetMeasurableCharacterRanges] (https://msdn.microsoft.com/en-us/library/system.drawing.stringformat.setmeasurablecharacterranges (v = vs.110) .aspx) pour des calculs plus précis . – TecMan

Répondre

-1

Vous allez avoir à boucle, caractère par caractère, par la chaîne, la mesure de chacun en utilisant Graphics.MeasureString jusqu'à ce qu'elle va au-delà du rectangle, puis hors tension par un personnage.

Cela devient plus complexe s'il s'agit d'une zone de texte multiligne, car vous devez alors déterminer les sauts de mots appropriés. Vous pouvez finir par désactiver plusieurs caractères si vous cassez des mots entiers.

+4

Vous pourriez le faire. Ou utilisez la surcharge MeasureString avec l'argument * charactersFitted *, c'est beaucoup plus simple. Il est inutile de mentionner textbox btw, il n'utilise pas DrawString. –

+0

Bien sûr, si vous voulez le faire en toute simplicité ... (je n'étais pas au courant de cette surcharge, merci!) –

+0

Ce n'est pas efficace. J'ai mis à jour ma question, lisez la section UPDATE. – TecMan