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;
Foi útil?

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 ..

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