Frage

Ich rendere Text in Direct2D/DirectWrite, rufe aber auf SetLineSpacing() auf entweder TextFormat oder TextLayout scheint keine Auswirkung zu haben.Weiß jemand warum?

War es hilfreich?

Lösung

Ich bin 99% sicher, dass dies ein Fehler ist. Ich habe ein wenig Spiel getan um mit Direct2D in letzten Zeit und auch ein Problem mit SetLineSpacing() auf Textlayout habe, denke, es ist das gleiche wie das, was Sie beschreiben, bestätigen kann ich in diesem Fall, dass es nicht nur Sie. Öffnen Sie erneut Ihre Bug-Report auf MS Connect wurde geschlossen.

Andere Tipps

Ich habe auch das gleiche Problem wie Dmitri Nesteruk sagte.

Allerdings finde ich heraus, dass, wenn Sie setzen das LineSpacing „nach CreateTextLayout“, SetLineSpacing kann nicht funktionieren.

Andernfalls, wenn Sie setzen LineSpacing vor CreateTextLayout, es kann jetzt arbeiten.

Vielleicht können Sie diese soluton versuchen.

PS: Mein env. ist in Windows Vista SP2.

Vielen Dank.

Leider bieten Sie keinen Code zu zeigen, was Sie zu tun versuchen. Ich gehe davon aus, dass Sie versuchen, den Zeilenabstand wie folgt festgelegt:

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

Die Dokumentation auf MSDN ist nicht sehr klar über die verschiedenen Zeilenabstand Methoden. Die Standardmethode bewirkt, daß der Abstand für jede Zeile aus den verwendeten Schriftart und Inline-Objekten abgeleitet werden, wenn überhaupt, so dass jede Zeile ist die Höhe, die es nach seinem Inhalt sein muss. In diesem Fall sind die beiden Parameter, lineSpacing und baseline, werden ignoriert.

Wenn Sie ein Textformat haben, die eine einzelne Schriftart verwendet (und Schriftgröße) und keine Inline-Objekte (oder Inline-Objekte, die nicht höher als der Text sind), können Sie einheitlichen Zeilenabstand angeben. Dies ist, was die DWRITE_LINE_SPACING_METHOD_UNIFORM für ist. Ich habe es gerade versucht, und ruft SetLineSpacing() mit dieser Methode führt zu gleichmäßigen Zeilenabstand entsprechend den übergebenen Argumente.

Beginnend mit 10 Windows gibt es eine dritte Zeilenabstand Methode, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, die verwendet werden können, um den Zeilenabstand zu erreichen, die zu dem, was geben Sie die Schriftgrößen und Inline-Objekte relativ. Dies wird jedoch nur unter Windows unterstützt 10.

Der irreführende Teil, in meiner Erfahrung ist, dass SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) Aufruf ohne Fehler erfolgreich ist, und anschließend den Zeilenabstand Parameter abrufen, die GetLineSpacing() Methode verwendet, gibt die Werte, die zur Verfügung gestellt wurden (während sie noch erreichen nichts) . Die API ist in dieser Hinsicht stimmig, nicht die angegebenen Werte zu verwerfen, auch wenn sie nicht erreichen, etwas Sinnvolles. Auch, wenn Sie auf einem GetLineSpacing() neugeschaffenen IDWriteTextFormat oder IDWriteTextLayout Instanz aufrufen, werden die zurückgegebenen Werte als Null ist (was richtig ist, weil der Linienabstand Methode ist DWRITE_LINE_SPACING_METHOD_DEFAULT). Um in der Lage sein, etwas Sinnvolles zu tun, müssen Sie die Standard-Zeilenabstand für die Schriftart bestimmen, die Sie verwenden. Sie können dies erreichen, indem IDWriteFont::GetMetrics() auf die Schriftart aufrufen Sie verwenden. Der Standard-Zeilenabstand ist die Summe der ascent, descent und lineGap Werte.

Charles Petzold schrieb darüber in einem Artikel über Paginierung Mit Direct .

Bin ich etwas fehlt?

IDWriteTextFormat noch IDWriteTextLayout hat eine SetLineHeight Funktion ...

Haben Sie den HRESULT Fehlercode von SetLineSpacing() zurücküberprüft?

. Hinweis: Wenn Sie Visual Studio geben Sie einfach eax,hr in einer der Debug-Uhr-Fenster verwenden einen möglichen Fehlercode direkt nach dem Aufruf zu sehen

Quelle

minimal unterstützter Client:Windows 7, Windows Vista mit SP2 und Plattform-Update für Windows Vista.

Führen Sie eine der oben genannten Windows-Versionen aus?Ich glaube, der Grund dafür, dass Sie keine Änderungen sehen, liegt darin, dass eine Version unterhalb der oben aufgeführten Versionen SetLineSpacing() in DirectWrite nicht unterstützt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top