Pergunta

Estou renderização de texto em Direct2D / DirectWrite, mas chamando SetLineSpacing() em ambos TextFormat ou TextLayout parece ter nenhum efeito. Alguém sabe por que?

Foi útil?

Solução

eu estou 99% certo de que este é um bug. eu ter feito um pouco brincar com Direct2D ultimamente e também teve um problema com SetLineSpacing() em TextLayout, acho que é a mesma coisa que você estão descrevendo, nesse caso eu posso confirmar que não é só você. Reabrir seu relatório de bug no MS Connect, que foi fechada.

Outras dicas

Eu ainda tenho o mesmo problema, como disse Dmitri Nesteruk.

No entanto, acho que se você definir o linespacing "depois CreateTextLayout", SetLineSpacing não pode trabalho.

Caso contrário, se você definir linespacing antes CreateTextLayout, ele pode trabalhar agora.

Talvez você pode tentar este soluton.

PS: Meu env. está em Window Vista SP2.

Muito obrigado.

Infelizmente você não fornecer código mostrando o que você está tentando fazer. Estou assumindo que você está tentando definir o espaçamento entre linhas como esta:

pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);

A documentação no MSDN não é muito clara sobre os diferentes métodos de espaçamento entre linhas. O método faz com que o padrão de espaçamento para cada linha para ser derivadas das fontes e em linha objectos utilizados, se for o caso, de modo que cada linha é a altura em que se necessita de ser de acordo com o seu conteúdo. Neste caso, os dois parâmetros, lineSpacing e baseline, são ignorados.

Se você tem um formato de texto que utiliza uma única fonte (e tamanho da fonte) e não objetos embutidos (ou objetos embutidos que não superior ao texto são), você pode especificar o espaçamento de linha uniforme. Isto é o que o DWRITE_LINE_SPACING_METHOD_UNIFORM é para. Eu apenas tentei isso e chamando SetLineSpacing() com esse método resulta em linha uniforme espaço de acordo com os argumentos passados.

A partir do Windows 10, há um terceiro espaçamento entre linhas método, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, que pode ser usado para alcançar o espaçamento de linha que é relativo ao que os tamanhos de fonte e objetos embutidos especificar. No entanto, isso só é suportada no Windows 10.

A parte mais enganadora, na minha experiência, é que chamando SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) consegue sem um erro, e recuperar o espaçamento entre linhas parâmetros depois, usando o método GetLineSpacing(), retorna os valores que foram fornecidos (enquanto eles ainda não conseguir qualquer coisa) . A API é internamente consistente a esse respeito, não descartando os valores especificados, mesmo que eles não conseguir qualquer coisa útil. Além disso, quando você chamar GetLineSpacing() em uma instância IDWriteTextFormat ou IDWriteTextLayout recém-criado, os valores são retornados como zero (o que é correto porque o método de espaçamento entre linhas é DWRITE_LINE_SPACING_METHOD_DEFAULT). A fim de ser capaz de fazer qualquer coisa útil, você tem que determinar a linha padrão de espaçamento para a fonte que você está usando. Você pode conseguir isso chamando IDWriteFont::GetMetrics() na fonte que você está usando. O espaçamento de linha padrão é a soma dos valores ascent, descent e lineGap.

Charles Petzold escreveu sobre isso em um artigo sobre Paginação Com DirectWrite .

Estou faltando alguma coisa?

Nem IDWriteTextFormat nem IDWriteTextLayout tem uma função SetLineHeight ...

Você verificou o código de erro HRESULT retornado por SetLineSpacing()?

Dica:. Se você estiver usando Visual Studio basta digitar eax,hr em uma das janelas do relógio de depuração para ver qualquer possível direito código de erro após a chamada

Fonte

cliente mínimo suportado:. Windows 7, Windows Vista com SP2 Update e plataforma para Windows Vista

Você executar qualquer uma das versões acima declarados de janelas? Acredito que a razão pela qual você não está vendo quaisquer mudanças é porque qualquer versão abaixo dos estados que estão acima não suporta o SetLineSpacing () in DirectWrite.

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