Question

Je suis le rendu de texte dans Direct2D/DirectWrite, mais en l'appelant SetLineSpacing() sur TextFormat ou TextLayout ne semble avoir aucun effet.Quelqu'un sait-il pourquoi?

Était-ce utile?

La solution

Je suis 99% sûr que ce soit un bug. Je l'ai fait un peu Jouer avec Direct2D ces derniers temps et a également eu un problème avec SetLineSpacing() sur TextLayout, pense qu'il est la même chose que ce que vous décrivent, dans ce cas, je peux confirmer que ce n'est pas seulement vous. Ouvrez à nouveau votre rapport de bogue sur MS Connect, il a été fermé.

Autres conseils

J'ai même le même problème que dit Dmitri Nesteruk.

Cependant, je trouve que si vous définissez le lineSpacing « après CreateTextLayout », setLineSpacing ne peut pas fonctionner.

Dans le cas contraire, si vous définissez LineSpacing avant CreateTextLayout, il peut fonctionner maintenant.

Peut-être que vous pouvez essayer cette Soluton.

PS: Mon env. est dans Windows Vista SP2.

Merci.

Malheureusement, vous ne fournissez pas de code montrant ce que vous essayez de faire. Je suppose que vous essayez de régler l'espacement des lignes comme ceci:

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

La documentation sur MSDN n'est pas très clair sur les différentes méthodes d'espacement des lignes. La méthode par défaut provoque l'espacement pour chaque ligne à tirer de la fonte utilisée et objets en ligne, le cas échéant, de sorte que chaque ligne est la hauteur à laquelle il doit être en fonction de son contenu. Dans ce cas, les deux paramètres, lineSpacing et baseline, sont ignorés.

Si vous avez un format de texte qui utilise une seule police (et la taille de la police), et aucun objet en ligne (ou les objets en ligne qui ne sont pas plus élevés que le texte), vous pouvez spécifier l'espacement des lignes uniforme. C'est ce que le DWRITE_LINE_SPACING_METHOD_UNIFORM est pour. Je viens d'essayer et d'appeler SetLineSpacing() avec cette méthode des résultats en ligne uniforme espacement selon les arguments passés.

À partir de Windows 10, il existe une méthode d'espacement troisième ligne, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, qui peut être utilisé pour réaliser l'espacement des lignes qui est par rapport à ce que la taille des polices et des objets en ligne précisent. Toutefois, cela est pris en charge sur Windows 10.

La partie la plus trompeuse, dans mon expérience, est que l'appel SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) réussit sans erreur, et la récupération des paramètres d'espacement de ligne après, en utilisant la méthode GetLineSpacing(), renvoie les valeurs fournies (alors qu'ils ne sont toujours parviennent pas à quoi que ce soit) . L'API est une cohérence interne à cet égard, pas rejeter les valeurs spécifiées, même si elles ne parviennent pas à quelque chose d'utile. Aussi, lorsque vous appelez GetLineSpacing() sur un IDWriteTextFormat ou une instance IDWriteTextLayout nouvellement créée, les valeurs sont retournées à zéro (ce qui est correct parce que la méthode d'espacement des lignes est DWRITE_LINE_SPACING_METHOD_DEFAULT). Afin de pouvoir faire quelque chose d'utile, vous devez déterminer l'espacement des lignes par défaut pour la police que vous utilisez. Vous pouvez y parvenir en appelant IDWriteFont::GetMetrics() sur la police que vous utilisez. L'espacement de ligne par défaut est la somme des valeurs ascent, descent et lineGap.

Charles Petzold a écrit à ce sujet dans un article sur Pagination Avec DirectWrite .

Est-ce que je manque quelque chose?

IDWriteTextFormat ni IDWriteTextLayout a une fonction SetLineHeight ...

Avez-vous vérifié le code d'erreur de HRESULT retourné par SetLineSpacing()?

Astuce:. Si vous utilisez Visual Studio il suffit de taper eax,hr dans l'une des fenêtres de la montre de débogage pour voir tout code d'erreur possible juste après l'appel

Source

minimum prise en charge du client:Windows 7, Windows Vista SP2 avec Plate-forme de mise à Jour pour Windows Vista.

Ne vous lancez tout de ce qui précède, les versions de windows?Je crois que la raison pour laquelle vous ne voyez pas toutes les modifications est parce que n'importe quelle version inférieurs à ceux des états ci-dessus ne prend pas en charge la SetLineSpacing() dans DirectWrite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top