Como faço para obter a posição da linha de base de texto em um rótulo e um NumericUpDown?

StackOverflow https://stackoverflow.com/questions/1006069

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top