Pergunta

Eu estou usando pixels como unidade para a minha fonte. Em um lugar, estou realizando um teste de visitas para verificar se o usuário clicou dentro do retângulo delimitador de algum texto na tela. Eu preciso usar algo como MeasureString para isso. Infelizmente, o código fazendo o teste de ocorrência é profundo dentro de uma biblioteca que não tem acesso a um objeto Graphics ou mesmo um Control.

Como faço para obter a caixa delimitadora de uma string dada a fonte sem usar a classe Graphics? Por que eu ainda preciso de um objeto Graphics quando a minha fonte é em pixels?

Foi útil?

Solução

Se você tem uma referência a System.Windows.Forms, tente usar a classe TextRenderer. Há um método estático (MeasureText) que leva a corda e fonte e retorna o tamanho. MSDN Fazer a ligação

Outras dicas

Você não precisa usar o objeto gráfico que você está usando para tornar a fazer a medição. Você poderia criar uma classe de utilitário estático:

public static class GraphicsHelper
{
    public static SizeF MeasureString(string s, Font font)
    {
        SizeF result;
        using (var image = new Bitmap(1, 1))
        {
            using (var g = Graphics.FromImage(image))
            {
                result = g.MeasureString(s, font);
            }
        }

        return result;
    }
}

Pode ser proveitoso, dependendo da sua situação para definir o dpi do bitmap também.

método MeasureString em resposta @NerdFury dará uma largura seqüência maior do que informações expected.Additional pode encontrar aqui . Se você quiser medir apenas o comprimento físico por favor, adicione duas linhas:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
result = 
  g.MeasureString(measuredString, font, int.MaxValue, StringFormat.GenericTypographic);

Este exemplo faz grande trabalho de ilustrar o uso de FormattedText. FormattedText fornece controle de baixo nível para desenhar texto em Windows Presentation Foundation (WPF) aplicativos. Você pode usá-lo para medir a largura de um fio com um determinado tipo de letra sem o uso de um objeto Graphics.

public static float Measure(string text, string fontFamily, float emSize)
{
    FormattedText formatted = new FormattedText(
        item, 
        CultureInfo.CurrentCulture, 
        System.Windows.FlowDirection.LeftToRight, 
        new Typeface(fontFamily), 
        emSize, 
        Brushes.Black);

    return formatted.Width;
}

Incluir bibliotecas WindowsBase e PresentationCore.

Isto não pode ser, mas uma repetição de outros, mas o meu problema era os gráficos indesejados objeto também. Depois de ouvir as frustrações acima Eu simplesmente tentei:

Size proposedSize = new Size(int.MaxValue, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.NoPadding;
Size ressize = TextRenderer.MeasureText(content, cardfont, proposedSize, flags);

(onde 'conteúdo' é a seqüência de medir e cardfont a fonte que está em)

... e foi na sorte. Eu poderia usar o resultado para definir a largura da minha coluna no VSTO.

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