2015-08-20 7 views
0

Я привел пример, чтобы обрезать тексты с использованием знака с многоточием: http://cx5software.sakura.ne.jp/blog/2011/01/18/directwrite-ellipsis-trimming-sign/IDWriteTextLayout не обрезает японское слово?

Он отлично подходит для текста на английском языке, но для японского текста он не работает. Кто-нибудь знает, почему?

Вот фрагмент моего кода, который пытается написать текст: «日本語 английский»

   m_dwrite_factory->CreateTextFormat(L"Arial Unicode MS", NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 14.0f * 96.0f/72.0f, L"ja-JP", m_dwrite_text_format.GetAddressOf()); 

       std::wstring text(L"日本語English"); 

       IDWriteInlineObjectPtr trimming; 
       m_dwrite_factory->CreateEllipsisTrimmingSign(m_dwrite_text_format.Get(), trimming.GetAddressOf()); 

       IDWriteTextLayoutPtr layout; 
       m_dwrite_factory->CreateTextLayout(text.c_str(), (UINT32)text.length(), m_dwrite_text_format.Get(), 50.0f, 100.0f, layout.GetAddressOf()); 

       DWRITE_TRIMMING trimmingOpt = {DWRITE_TRIMMING_GRANULARITY_CHARACTER, 0, 0}; 
       layout->SetTrimming(&trimmingOpt, trimming.Get()); 

       d2d->DrawTextLayout(D2D1::Point2F(0, 0), layout.Get(), m_d2d_brush_2.Get()); 

А вот полученный текст. Обратите внимание, что знак эллипса добавляется на английском языке, но не по японскому тексту.

enter image description here

+0

Вы должны показать тест с гораздо более длинным текстом, который будет иметь значение. – CodeAngry

+0

Это не имеет значения. Я попытался с более длинным текстом, более длинным макетом, но японский текст никогда не обрезается. – nikoniko

ответ

2

Идеограммы разрешается разрывать строки между символами, тогда как английские слова не имеют возможности разрыва между символами, если не разделяются пробелом или другой пунктуации, на основе правил из Unicode UAX 14 (http://www.unicode.org/reports/tr14/). Таким образом, ваш японский текст обертывается из-за узкой ширины 50 DIP, что означает, что каждая строка меньше ширины макета (так что нет обрезки), но английское слово не может обернуть и обрезать, поскольку оно превышает ширину макета.

+0

Aha. Ты прав. Японское слово было обернуто до того, как его можно обрезать. Если я добавлю layout-> SetWordWrapping (DWRITE_WORD_WRAPPING_NO_WRAP); то он работает так, как ожидалось. Спасибо ! – nikoniko

 Смежные вопросы

  • Нет связанных вопросов^_^