SetLineSpacing () não funciona em DirectWrite - por quê?
-
13-09-2019 - |
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?
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
cliente mínimo suportado:. Windows 7, Windows Vista com SP2 Update e plataforma para Windows Vista ??p>
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.