سؤال

أجد نصا في كتابة Direct2D / DirectWrite، لكن الاتصال SetLineSpacing() على أي من نصوص أو TextLayout يبدو أنه ليس له أي تأثير. هل يعرف أحد لماذا؟

هل كانت مفيدة؟

المحلول

أنا متأكد 99٪ أن هذا خطأ. لقد قمت باللعب قليلا مع Direct2D مؤخرا وكان أيضا مشكلة مع SetLineSpacing() على TextLayout، أعتقد أنه هو نفسه ما تصفه، في هذه الحالة، يمكنني تأكيد أنه ليس أنت فقط. أعد فتح تقرير الخطأ الخاص بك على MS Connect، تم إغلاقه.

نصائح أخرى

لدي حتى نفس المشكلة كما قال Dmitri nesteruk.

ومع ذلك، أجد أنه إذا قمت بتعيين الأسباب "بعد CreateTextLayout"، فإن Setloverpacing لا يمكن أن تعمل.

خلاف ذلك، إذا قمت بتعيين المؤسسات قبل CreateTextLayout، فيمكنه العمل الآن.

ربما يمكنك تجربة هذا سولوتون.

ملاحظة: ENV الخاص بي. في نافذة فيستا SP2.

تشكرات.

لسوء الحظ، لا تقدم التعليمات البرمجية التي تحاول القيام بها. أفترض أنك تحاول ضبط تباعد الأسطر مثل هذا:

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

لا يتم مسح الوثائق على MSDN بشكل رهيب عن طرق تباعد الأسطر المختلفة. تتسبب الطريقة الافتراضية في التباعد لكل سطر مشتق من الخط المستخدمة وكائنات مضمنة، إن وجدت، لذلك كل سطر هو الارتفاع الذي يحتاج إليه وفقا لمحتواه. في هذه الحالة، المعلمات اثنين، lineSpacing و baseline, يتم تجاهلها.

إذا كان لديك تنسيق نصي يستخدم خط واحد (وحجم الخط) ولا توجد كائنات مضمنة (أو كائنات مضمنة ليست أعلى من النص)، فيمكنك تحديد تباعد خط موحد. هذا هو ما DWRITE_LINE_SPACING_METHOD_UNIFORM هو ل. لقد جربتها فقط والاتصال SetLineSpacing() مع هذه الطريقة تؤدي إلى تباعد خط موحد وفقا للحجج المرة.

بدءا من Windows 10، هناك طريقة تباعد السطر الثالث، DWRITE_LINE_SPACING_METHOD_PROPORTIONAL, ، يمكن استخدامها لتحقيق تباعد الأسفل بالنسبة إلى ما يحدد أحجام الخطوط والأشياء المضمنة. ومع ذلك، هذا مدعوم فقط على نظام التشغيل Windows 10.

الجزء الأكثر مضللة، في تجربتي، هو أن الدعوة SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) ينجح دون خطأ، واسترجأ معلمات تباعد الأسطر بعد ذلك، باستخدام GetLineSpacing() الطريقة، إرجاع القيم التي تم توفيرها (في حين أنها لا تزال لا تحقق أي شيء). يتوافق API داخليا في هذا الصدد، وليس تجاهل القيم المحددة على الرغم من أنها لا تحقق أي شيء مفيد. أيضا، عند الاتصال GetLineSpacing() على المنشأة حديثا IDWriteTextFormat أو IDWriteTextLayout مثيل، يتم إرجاع القيم كلغة صفرية (وهي صحيحة لأن طريقة تباعد الأسطر هي DWRITE_LINE_SPACING_METHOD_DEFAULT). من أجل أن تكون قادرا على فعل أي شيء مفيد، يجب عليك تحديد تباعد الأسطر الافتراضي للخط الذي تستخدمه. يمكنك تحقيق ذلك عن طريق الاتصال IDWriteFont::GetMetrics() على الخط الذي تستخدمه. تباعد السطر الافتراضي هو مجموع ascent, descent و lineGap القيم.

كتب تشارلز بيتزولد عن هذا في مقال حول ترقيم الصفحات مع الكتابة الميرانية.

هل فاتني شيء؟

لا هذا ولا ذاك idwritetextformat. ولا idwritetextlayout. لديه وظيفة setlineheight ...

هل راجعت HRESULT رمز الخطأ الذي تم إرجاعه بواسطة SetLineSpacing()?

تلميح: إذا كنت تستخدم Visual Studio فقط النوع eax,hr في أحد Windows Watch Watch لرؤية أي رمز خطأ ممكن مباشرة بعد المكالمة.

مصدر

الحد الأدنى للعميل المدعوم: Windows 7، Windows Vista مع SP2 وتحديث النظام الأساسي لنظام التشغيل Windows Vista.

هل تدير أي من الإصدارات المذكورة أعلاه من Windows؟ أعتقد أن السبب وراء عدم رؤية أي تغييرات لأن أي إصدار أسفل تلك الدول أعلاه لا يدعم SetLespactPacing () في الكتابة المطردة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top