Tall in the Center
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; class FontMenuForm: Form { protected string strText = "Tall in the Center"; protected Font font = new Font("Times New Roman", 24); public static void Main() { Application.Run(new FontMenuForm()); } public FontMenuForm() { ResizeRedraw = true; } protected void DoPage(Graphics grfx, Color clr, int cx, int cy) { GraphicsPath path = new GraphicsPath(); float fFontSize = PointsToPageUnits(grfx, font); path.AddString(strText, font.FontFamily, (int) font.Style, fFontSize, new PointF(0, 0), new StringFormat()); RectangleF rectf = path.GetBounds(); path.Transform(new Matrix(1, 0, 0, 1, -(rectf.Left + rectf.Right) / 2, -(rectf.Top + rectf.Bottom) / 2)); rectf = path.GetBounds(); PointF[] aptf = path.PathPoints; for (int i = 0; i < aptf.Length; i++) aptf[i].Y *= 2 * (rectf.Width - Math.Abs(aptf[i].X)) / rectf.Width; path = new GraphicsPath(aptf, path.PathTypes); grfx.TranslateTransform(cx / 2, cy / 2); grfx.FillPath(new SolidBrush(clr), path); } public float GetAscent(Graphics grfx, Font font) { return font.GetHeight(grfx) * font.FontFamily.GetCellAscent(font.Style) / font.FontFamily.GetLineSpacing(font.Style); } public float GetDescent(Graphics grfx, Font font) { return font.GetHeight(grfx) * font.FontFamily.GetCellDescent(font.Style) / font.FontFamily.GetLineSpacing(font.Style); } public float PointsToPageUnits(Graphics grfx, Font font) { float fFontSize; if (grfx.PageUnit == GraphicsUnit.Display) fFontSize = 100 * font.SizeInPoints / 72; else fFontSize = grfx.DpiX * font.SizeInPoints / 72; return fFontSize; } }