如何水平居中对齐文本?
Posted
技术标签:
【中文标题】如何水平居中对齐文本?【英文标题】:How to center align text horizontally? 【发布时间】:2020-11-02 21:41:22 【问题描述】:我正在 ImGui 中创建文本。它会自动右对齐,我如何让一个文本居中对齐?
ImGui::Text("Example Text");
我不相信有这样的功能。我知道你可以为一个框或小部件做到这一点,但是对于一个简单的文本我该怎么做呢?
【问题讨论】:
【参考方案1】:void TextCentered(std::string text)
auto windowWidth = ImGui::GetWindowSize().x;
auto textWidth = ImGui::CalcTextSize(text.c_str()).x;
ImGui::SetCursorPosX((windowWidth - textWidth) * 0.5f);
ImGui::Text(text.c_str());
【讨论】:
【参考方案2】:只想为多行文本添加一个解决方案,为某人节省 5 分钟。
void TextCentered(std::string text)
float win_width = ImGui::GetWindowSize().x;
float text_width = ImGui::CalcTextSize(text.c_str()).x;
// calculate the indentation that centers the text on one line, relative
// to window left, regardless of the `ImGuiStyleVar_WindowPadding` value
float text_indentation = (win_width - text_width) * 0.5f;
// if text is too long to be drawn on one line, `text_indentation` can
// become too small or even negative, so we check a minimum indentation
float min_indentation = 20.0f;
if (text_indentation <= min_indentation)
text_indentation = min_indentation;
ImGui::SameLine(text_indentation);
ImGui::PushTextWrapPos(win_width - text_indentation);
ImGui::TextWrapped(text.c_str());
ImGui::PopTextWrapPos();
【讨论】:
【参考方案3】:这个comment on a similar GitHub issue 可以提供帮助,不过我自己还没有尝试过:
void TextCenter(std::string text)
float font_size = ImGui::GetFontSize() * text.size() / 2;
ImGui::SameLine(
ImGui::GetWindowSize().x / 2 -
font_size + (font_size / 2)
);
ImGui::Text(text.c_str());
【讨论】:
我目前正在尝试使用新的 Table API 解决这个问题【参考方案4】:没有 std::string 的更高效的方式
void TextCenter(const char* text, ...)
va_list vaList = nullptr;
va_start(vaList, &text, );
float font_size = ImGui::GetFontSize() * strlen(text) / 2;
ImGui::SameLine(
ImGui::GetWindowSize().x / 2 -
font_size + (font_size / 2)
);
ImGui::TextV(text, vaList);
va_end(vaList);
【讨论】:
以上是关于如何水平居中对齐文本?的主要内容,如果未能解决你的问题,请参考以下文章