Pregunta

Estoy de representación de texto en Direct2D/DirectWrite, pero las llamadas SetLineSpacing() en cualquiera de los TextFormat o TextLayout parece no tener efecto.¿Alguien sabe por qué?

¿Fue útil?

Solución

Estoy 99% seguro de que esto es un error. He hecho un poco de juego alrededor con Direct2D últimamente y también tenía un problema con SetLineSpacing() en TextLayout, creo que es lo mismo que lo que estamos describiendo, en ese caso, puedo confirmar que no se trata sólo usted. Reabrir su informe de error en MS Connect, que se ha cerrado.

Otros consejos

incluso tengo el mismo problema que dijo Dmitri Nesteruk.

Sin embargo, me entero de que si se establece el interlineado "después de CreateTextLayout", SetLineSpacing no puede trabajar.

De lo contrario, si se establece interlineado antes CreateTextLayout, puede ahora trabajar.

Tal vez usted puede probar este Soluton.

PD: Mi env. está en Windows Vista SP2.

Muchas gracias.

Desafortunadamente no proporciona código que lo que estamos tratando de hacer. Estoy asumiendo que usted está tratando de establecer el espaciado de línea como la siguiente:

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

La documentación en MSDN no es terriblemente claro acerca de los diferentes métodos de espaciamiento de línea. El método por defecto hace que el espaciamiento para cada línea que se deriva de los objetos de fuente y en línea utilizados, en su caso, por lo que cada línea es la altura que tiene que ser de acuerdo con su contenido. En este caso, los dos parámetros, lineSpacing y baseline, se ignoran.

Si usted tiene un formato de texto que utiliza una sola fuente (tipo de letra y tamaño) y no hay objetos en línea (inline u objetos que no son más que el texto), puede especificar el espaciado de línea uniforme. Esto es lo que el DWRITE_LINE_SPACING_METHOD_UNIFORM es para. Yo sólo lo he probado y SetLineSpacing() llamando con este método resulta en línea uniforme el espacio según los argumentos pasados.

A partir de Windows 10, hay un método de separación tercera línea, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, que se puede utilizar para lograr espaciado de línea que es relativo a lo que los tamaños de fuente y objetos en línea especifican. Sin embargo, esto sólo es compatible con Windows 10.

La parte más engañosa, en mi experiencia, es que llamar SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) tiene éxito sin un error, y la recuperación de los parámetros de espaciado de línea después, utilizando el método GetLineSpacing(), devuelve los valores que se proporcionaron (cuando aún no logran nada) . El API es internamente coherente en este sentido, no descartando los valores especificados a pesar de que no logran nada útil. También, cuando se llama a GetLineSpacing() en un IDWriteTextFormat o IDWriteTextLayout ejemplo recién creado, los valores se devuelven como cero (que es correcto porque el método de separación de líneas es DWRITE_LINE_SPACING_METHOD_DEFAULT). Con el fin de ser capaz de hacer algo útil, usted tiene que determinar el espaciado de línea por defecto de la fuente que está utilizando. Esto se puede conseguir llamando IDWriteFont::GetMetrics() de la fuente que está utilizando. El espaciado de línea por defecto es la suma de los valores ascent, descent y lineGap.

Charles Petzold escribió sobre esto en un artículo sobre Paginación Con DirectWrite .

Me estoy perdiendo algo?

IDWriteTextFormat ni IDWriteTextLayout tiene una función SetLineHeight ...

¿Ha comprobado el código de error devuelto por HRESULT SetLineSpacing()?

Consejo:. Si está utilizando Visual Studio sólo tienes que escribir eax,hr en una de las ventanas de depuración reloj para ver cualquier código de error posible, justo después de la llamada

Fuente

se admite un mínimo de cliente:Windows 7, Windows Vista con SP2 y Actualización de la Plataforma de Windows Vista.

Hacer ejecutar cualquiera de las siguientes versiones de windows?Creo que la razón por la que usted no está viendo los cambios ya que cada versión por debajo de los estados de arriba no apoyo la SetLineSpacing() en DirectWrite.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top