Mon problème:
Je travaille actuellement sur un contrôle utilisateur personnalisé qui affiche des morceaux de texte (chacun avec une police potentiellement différente) sur une ligne. Je voudrais aligner tous ces bits de texte exactement le long d'une ligne de base commune. Par exemple:En utilisant GDI +, quelle est l'approche la plus simple pour aligner du texte (dessiné dans plusieurs polices différentes) le long d'une ligne de base commune?
Hello, I am George.
------------------------------ <- all text aligns to a common baseline
^ ^ ^
| | |
Courier Arial Times <- font used for a particular bit of text
20pt 40pt 30pt
Parce que je ne l'ai pas trouvé de GDI + fonctionnalités pour le faire directement, je suis venu avec ma propre méthode (décrite ci-dessous). Cependant:
Je me demande s'il n'y a vraiment pas un moyen plus facile d'y arriver?
Mon approche actuelle:
1) Gather une liste de tous les System.Drawing.Font
s qui seront utilisés pour l'affichage de texte.
2) Pour chaque Font
, pour la position verticale de la ligne de base en pixels, en utilisant le code suivant:
// variables used in code sample (already set)
Graphics G;
Font font;
...
// compute ratio in order to convert from font design units to pixels:
var designUnitsPerPixel = font.GetHeight(G)/
font.FontFamily.GetLineSpacing(font.Style);
// get the cell ascent (baseline) position in design units:
var cellAscentInDesignUnits = font.FontFamily.GetCellAscent(font.Style);
// finally, convert the baseline position to pixels:
var baseLineInPixels = cellAscentInDesignUnits * designUnitsPerPixel;
3) Pour tous les Font
s utilisés, déterminer la valeur baseLineInPixels
maximale calculé ci-dessus et stocker cette valeur à maxBaseLineInPixels
.
4) Dessiner chaque bit de texte de la manière suivante:
// variables used in code sample (already set):
Graphics G;
Font font;
string text;
...
// find out how much space is needed for drawing the text
var measureF = G.MeasureString(text, font);
// determine location where text will be drawn:
var layoutRectF = new RectangleF(new PointF(0f, 0f), measureF);
layoutRectF.Y += maxBaseLineInPixels - baseLineInPixels;
//^the latter value 'baseLineInPixels' is specific to the font used
// draw text at specified location
G.DrawString(text, font, Brushed.Black, layoutRectF);
Suis-je manque quelque chose, ou est-il vraiment aucun moyen plus facile?
Sachez-le aujourd'hui et hier. Semble être la seule solution. Notez que Font.GetHeight (Graphics) retournera la valeur dans le PageUnit de l'objet Graphics, plutôt que dans les pixels. J'utilise maintenant la solution de Bob Powell (http://www.bobpowell.net/formattingtext.htm) maintenant, en utilisant le dernier bloc de code dans son article (bien, en C#), et en convertissant en millimètres, puisque j'en ai besoin pour une routine de création partagée d'impression/dessin/PDF. – OregonGhost
Merci pour vos commentaires. Je suis soulagé d'entendre (eh bien ... :) que dessiner du texte avec GDI + en fait * est * si compliqué et que je n'imagine pas seulement ça. J'ai depuis décidé de laisser tomber ce problème et de continuer vers WPF (où GDI + ne compte plus et les choses seront heureusement un peu plus faciles). – stakx