使用 ImGui 显示更长的字符串

Show longer String with ImGui

我正在使用 ImGui,OpenGL 的实现工作正常,但现在我在渲染一些文本时遇到了问题。出于某种原因,每当我尝试使用 ImGui::Text(someString.c_str()); 渲染字符串时,ImGui 只渲染前 19 个字符。如果我尝试使用 ImGui::Text("This is a Text longer than 19 characters") 渲染相同的文本,ImGui 会渲染整个文本。

我也用 ImGui::TextUnformatted(&someString[0], &someString[someString.size()-1]); 试过了,同样的结果:显示了前 19 个字符,但其余的被切掉了。

但是如果我这样做 std::clog << someString.c_str() 它完全可以正常工作。

如果有人能发现我的错误,我将非常高兴,我尝试了很多小时但无法修复它。

问题是我从来没有想过使用另一个字符串... someString 的内容包含一个终止字符串的 'ü'。但为什么 'ü' 不能与 ImGui 一起工作是另一个问题。

为了让 ImGui 渲染非标准字符,您需要指定字体应使用的字符范围,并指示 ImGui 在渲染该字体时使用 utf-8 编码。

根据你要显示的字符,你需要根据他们的utf-8代码页添加相应的代码。大致如下:

const ImWchar*  ImFontAtlas::GetGlyphRangesPolish()
{
    static const ImWchar ranges[] =
    {
        0x0020, 0x00FF, // Basic Latin + Latin Supplement
        0x00A0, 0x02D9, // Polish characters 
        0,
    };
    return &ranges[0];
}

然后您需要将该范围添加到您要在程序中使用的字体:

ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 17.0f, nullptr, io.Fonts->GetGlyphRangesPolish());

现在您可以在 ImGui 中使用额外导入的文本字符了

ImGui::TextWrapped("łąężü");

如果不使用这个方法,会显示??????字符而不是您在 ImGui 中需要的字符。