MeasureString () almofadas o texto à esquerda e à direita
-
02-07-2019 - |
Pergunta
Eu estou usando GDI + em C ++. (Este problema pode existir em C # também).
Eu noto que quando eu ligar Graphics :: MeasureString () ou Graphics :: DrawString (), a cadeia é preenchida com espaço em branco à esquerda e à direita.
Por exemplo, se eu estou usando uma fonte Courier, (! Não itálico) e eu medir "P" Recebo 90, mas "PP" me dá 150. Eu esperaria uma fonte monoespaçada para dar exatamente o dobro da largura de "PP".
A minha pergunta é: é esta intencional ou comportamento documentado, e como faço para desativar isso?
RectF Rect(0,0,32767,32767);
RectF Bounds1, Bounds2;
graphics->MeasureString(L"PP", 1, font, Rect, &Bounds1);
graphics->MeasureString(L"PP", 2, font, Rect, &Bounds2);
margin = Bounds1.Width * 2 - Bounds2.Width;
Solução
É por design, esse método não usa os glifos reais para medir a largura e assim acrescenta um pouco de preenchimento no caso de saliências.
MSDN sugere o uso de um método diferente se precisar de mais precisão :
Para obter métricas adequadas para cordas adjacentes no layout (por exemplo, ao implementar texto formatado), use o MeasureCharacterRanges método ou um dos MeasureString métodos que leva um StringFormat , e passar GenericTypographic . Além disso, garantir o TextRenderingHint para o < a href = "http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" rel = "nofollow noreferrer"> Gráficos é AntiAlias ??.
Outras dicas
É verdade que é por design, no entanto, o link na resposta aceita na verdade não é perfeito. A questão é o uso de carros alegóricos em todos esses métodos quando o que você realmente quer estar usando é pixels (ints).
O TextRenderer classe é destinado a este fim e trabalhos com os tamanhos verdadeiros. Veja este href="http://msdn.microsoft.com/en-us/library/7sy6awsb.aspx" ligação do MSDN para um passo a passo da utilização deste.
Anexar StringFormat.GenericTypographic
irá corrigir o problema:
graphics->MeasureString(L"PP", 1, font, width, StringFormat.GenericTypographic);
Aplicar o mesmo atributo para DrawString
.
Parece que ele também pode se conectar a insinuando, com base neste artigo kb, Por texto aparece diferente quando desenhado com GDIPlus contra GDI
TextRenderer foi ótimo para obter o tamanho da fonte. Mas no circuito desenho, usando TextRenderer.DrawText foi dolorosamente lento em comparação com graphics.DrawString ().
Uma vez que a largura de uma string é o problema, o muito melhor fora de usar uma combinação de TextRenderer.MeasureText e graphics.DrawString ..