IDWriteTextLayout不修剪日文单词?

时间:2015-08-20 08:08:18

标签: direct2d directwrite

我在这里按照示例使用省略号符号来修剪文本:http://cx5software.sakura.ne.jp/blog/2011/01/18/directwrite-ellipsis-trimming-sign/

它适用于英文文本,但不适用于日文文本。有谁知道为什么?

以下是我的代码片段,它试图写一个文字:“日本语英语”

                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

1 个答案:

答案 0 :(得分:3)

允许表意文字在字符之间断行,而英文单词在字符之间没有中断机会,除非按空格或其他标点符号分隔,基于Unicode UAX 14(http://www.unicode.org/reports/tr14/)的规则。所以你的日文文本由于50 DIPs宽度的宽度而包装,这意味着每一行都小于布局宽度(因此不会发生修剪),但英文单词无法换行并因为超出布局宽度而被修剪。