Pergunta

Eu tenho uma subclasse um controle em C # WinForms, e estou costume desenho de texto em meu manipulador OnPaint(). A fonte é definida como Courier New usando o seguinte código na minha forma:

FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);

No próprio controle, a seqüência é armazenado em realText, e eu uso o seguinte código para desenhá-lo para a tela:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}

O resultado para alguns exemplos aleatórios aparência de texto da seguinte forma: http://img219.imageshack.us/img219/1778/courier.png

Se você aumentar o zoom, você pode ver, por exemplo, que o espaço entre o primeiro 'como' é diferente do que o espaço entre a segunda 'como' (1 pixels contra 2 pixels). Alguém tem alguma idéia do que pode estar causando isso, ou como posso impedir que isso aconteça? Há muito estranheza mais similares em espaçamento como eu desenhar com fontes diferentes, mas presumo que eles são todos os resultados do mesmo problema.

Agradecemos antecipadamente por qualquer idéia que você pode ter.

Foi útil?

Solução

Eu estou indo supor que é porque você está usando Graphics.DrawString() em vez de TextRenderer.DrawText() . O texto ex tintas usando GDI + que é tipo de porcaria e ultrapassada. A usos último GDI que é mais moderno (em termos de processamento de texto). Eu acredito que esta é a diferença observado pela resposta anterior (WinForms vs. Windows).

Você também pode tentar a sobrecarga de Graphics.DrawString() que leva um StringFormat objeto e especificar StringFormat.GenericTypographic. No entanto, este é realmente um pouco de um corte em torno do problema. Se você estiver usando .NET 2.0 ou posterior, você deve estar usando a classe TextRenderer em vez da classe Graphics de baixa qualidade para todas as suas necessidades de processamento de texto. Graphics.MeasureString() e Graphics.DrawString() existem estritamente para compatibilidade com .NET 1.0 e 1.1.

edit: Ah sim, e seu código vazamentos um objeto GDI em cada ciclo de pintura. objetos de pincel são geridos wrappers em torno de recursos não gerenciados, portanto, eles devem ser explicitamente descartado.

Outras dicas

Eu tenho que ser honesto, mas isso nunca aconteceu comigo antes. No entanto, tente definir o SmoothingMode para Antialiasing:

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

Outra coisa de lado, certifique-se a partir do seu uso tem DoubleBuffer conjunto para true. Além disso, não tente criar uma nova SolidBrush em cada chamada OnPaint ..

A minha experiência com pintura texto nos controlos de subclasse usando WinForms é que o motor de renderização de texto que utiliza (GDI +?) Não é tão bom quanto o próprio motor da fonte do Windows e certamente dá resultados diferentes, mesmo quando ele funciona bem.

Eu sou o autor de um suplemento Visual Studio ( http://entrian.com/source-search ) que as necessidades para pintar controles dentro do Visual Studio, e, a fim de tornar as fontes olhar o mesmo que os controles padrão no Visual Studio (ListViews, treeviews, etc.) Eu tenho que WinForms de bypass e pintar o texto usando o Win32 API:

[DllImport("gdi32.dll")]
public static extern bool ExtTextOut(IntPtr hdc, int X, int Y,
   uint fuOptions, [In] ref RECT lprc, string lpString, uint cbCount,
   [In] int[] lpDx);

... e familiar.

Provavelmente não o que você queria ouvir, mas ele está lá.

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