2009-11-03 16 views
4

Je rends du texte dans Direct2D/DirectWrite, mais l'appel SetLineSpacing() sur TextFormat ou TextLayout semble n'avoir aucun effet. Quelqu'un sait-il pourquoi?SetLineSpacing() ne fonctionne pas dans DirectWrite - pourquoi?

+0

Cela pourrait être un bug: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=507456 – Kredns

+1

j'ai posté ce bug, mais pensé qu'il serait prudent de demander ici, au cas où je fais quelque chose de mal. –

+1

Montrez-nous votre code. – Goz

Répondre

5

Je suis sûr à 99% que c'est un bug. J'ai fait un peu de jeu avec Direct2D ces derniers temps et j'ai aussi eu un problème avec SetLineSpacing() sur TextLayout, je pense que c'est la même chose que ce que vous décrivez, dans ce cas je peux confirmer que ce n'est pas seulement vous. Rouvrez votre rapport de bug sur MS Connect, il a été fermé.

+0

Je ne sais pas si cela n'a pas vraiment fonctionné en 2009, mais au moins maintenant appeler 'SetLineSpacing()' fonctionne comme prévu. Le problème est que lorsque vous spécifiez 'DWRITE_LINE_SPACING_METHOD_DEFAULT', les deux valeurs flottantes sont ignorées, car elles n'ont pas de sens dans ce contexte. L'espacement des lignes par défaut signifie "dériver l'interligne des polices utilisées et des objets en ligne". Voir ma réponse ci-dessous pour plus d'informations. – Pepor

0

Avez-vous vérifié le code d'erreur retourné par HRESULTSetLineSpacing()? Conseil: Si vous utilisez Visual Studio, saisissez eax,hr dans l'une des fenêtres de contrôle de débogage pour voir le code d'erreur possible immédiatement après l'appel.

+0

Oui, et c'est S_OK –

-2

Source

client minimum pris en charge: Windows 7, Windows Vista SP2 et mise à jour pour la plate-forme Windows Vista.

Exécutez-vous l'une des versions de Windows mentionnées ci-dessus? Je crois que la raison pour laquelle vous ne voyez aucun changement est parce que n'importe quelle version au-dessous des états ci-dessus ne supporte pas le SetLineSpacing() dans DirectWrite.

+0

Le fait que je l'exécute impliquerait que je suis, en fait, en utilisant un système d'exploitation pris en charge, dans ce cas 2008R2. –

2

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

Cependant, je découvre que si vous définissez le lineSpacing "après CreateTextLayout", SetLineSpacing ne peut pas fonctionner.

Sinon, si vous définissez LineSpacing avant CreateTextLayout, cela peut fonctionner maintenant.

Peut-être que vous pouvez essayer ce soluton.

PS: Mon env. est dans Windows Vista SP2.

Merci beaucoup.

1

Malheureusement vous ne fournissez pas de code indiquant 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 de chaque ligne à partir de la police utilisée et des objets en ligne, le cas échéant, de sorte que chaque ligne est la hauteur dont elle a besoin en fonction de son contenu. Dans ce cas, les deux paramètres, lineSpacing et baseline, sont ignorés. Si vous avez un format texte qui utilise une seule police (et une taille de police) et aucun objet en ligne (ou des objets en ligne qui ne sont pas plus élevés que le texte), vous pouvez spécifier un interligne uniforme. C'est pour cela que le DWRITE_LINE_SPACING_METHOD_UNIFORM est destiné. Je viens de l'essayer et appeler SetLineSpacing() avec cette méthode entraîne un espacement de ligne uniforme en fonction des arguments passés.À partir de Windows 10, il existe une troisième méthode d'espacement de ligne, DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, qui peut être utilisée pour obtenir un espacement de ligne relatif à ce que spécifient les tailles de police et les objets en ligne. 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 qui ont été fourni (alors qu'ils ne réalisent toujours rien). L'API est intrinsèquement cohérente à cet égard, ne rejetant pas les valeurs spécifiées, même si elles ne réalisent rien d'utile. En outre, lorsque vous appelez GetLineSpacing() sur une instance IDWriteTextFormat ou IDWriteTextLayout nouvellement créée, les valeurs sont renvoyées comme zéro (ce qui est correct car la méthode d'interlignage est DWRITE_LINE_SPACING_METHOD_DEFAULT). Afin de pouvoir faire quelque chose d'utile, vous devez déterminer l'interligne par défaut pour la police que vous utilisez. Vous pouvez y parvenir en appelant le IDWriteFont::GetMetrics() sur la police que vous utilisez. L'interligne par défaut est la somme des valeurs ascent, descent et lineGap.

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