-2

我正在使用 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(),它完全可以正常工作。

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

4

2 回答 2

1

问题是我从来没有使用另一个字符串的想法...... 的内容someString包含一个终止字符串的“ü”。但为什么 'ü' 不适用于 ImGui 是另一个问题。

于 2020-05-22T15:32:16.113 回答
1

为了让 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 中需要的字符。

在此处输入图像描述

于 2021-05-03T17:02:28.193 回答