Como faço para obter a posição da linha de base de texto em um rótulo e um NumericUpDown?
Pergunta
Eu estou tentando alinhar uma Label
e uma NumericUpDown
por suas linhas de base de texto. Estou fazendo isso no código, em vez do designer. Como faço para obter a posição da linha de base de texto?
Solução
// para processar texto com base nas coordenadas (pt.X, pt.Y):
Font myFont = Label1.Font;
FontFamily ff = myFont.FontFamily;
float lineSpace = ff.GetLineSpacing(myFont.Style);
float ascent = ff.GetCellAscent(myFont.Style);
float baseline = myFont.GetHeight(ev.Graphics) * ascent / lineSpace;
PointF renderPt = new PointF(pt.X, pt.Y - baseline));
ev.Graphics.DrawString("Render this string", myFont, textBrush, renderPt);
Outras dicas
Para o controle Label, você pode obter a posição do fundo do texto desta forma:
Assumindo que o .TextAlign é definido como TopLeft ou TopCenter ou TopRight, a parte inferior do texto no controlo de etiqueta podem ser encontrados por este método:
dim btmOfText as single
btmOfText = Label1.Font.GetHeight + Label1.Top
O método .GetHeight retorna a altura, em pixels da fonte atual usado pelo Label.
Se o .TextAlign é Médio ou inferior, então você precisa fazer um cálculo um pouco mais complexo.
Esse mesmo método também funcionará com o controle NumericUpDown.