如何右对齐 ImGui 列中的文本?
How to right align text in ImGui Columns?
假设我用以下内容创建了一个 table:
ImGui::Columns(3);
ImGui::Text("Header 1");
ImGui::NextColumn();
ImGui::Text("Header 2");
ImGui::NextColumn();
ImGui::Text("Header 3");
ImGui::NextColumn();
ImGui::Text("1");
ImGui::NextColumn();
ImGui::Text("2");
ImGui::NextColumn();
ImGui::Text("3");
ImGui::NextColumn();
ImGui::Columns(1);
如何使第二行(1、2 和 3)中的文本在该列中右对齐?我看过 CalcItemWidth
和 CalcTextSize
,但我无法弄清楚它们在多列行中的工作方式。
我在 ImGui Discord 频道得到帮助,想出了这个解决方案:
ImGui::NextColumn();
std::string text = "1";
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetColumnWidth() - ImGui::CalcTextSize(text.c_str()).x
- ImGui::GetScrollX() - 2 * ImGui::GetStyle().ItemSpacing.x);
ImGui::Text("%s", text);
与 iHowell 答案几乎相同的代码,但应根据当前位置值检查新的 x 位置,以便很好地 window-边界对齐(文本将被右剪裁)。
在代码中:
ImGui::NextColumn();
std::string text = "1";
auto posX = (ImGui::GetCursorPosX() + ImGui::GetColumnWidth() - ImGui::CalcTextSize(text.c_str()).x
- ImGui::GetScrollX() - 2 * ImGui::GetStyle().ItemSpacing.x);
if(posX > ImGui::GetCursorPosX())
ImGui::SetCursorPosX(posX);
ImGui::Text("%s", text);
假设我用以下内容创建了一个 table:
ImGui::Columns(3);
ImGui::Text("Header 1");
ImGui::NextColumn();
ImGui::Text("Header 2");
ImGui::NextColumn();
ImGui::Text("Header 3");
ImGui::NextColumn();
ImGui::Text("1");
ImGui::NextColumn();
ImGui::Text("2");
ImGui::NextColumn();
ImGui::Text("3");
ImGui::NextColumn();
ImGui::Columns(1);
如何使第二行(1、2 和 3)中的文本在该列中右对齐?我看过 CalcItemWidth
和 CalcTextSize
,但我无法弄清楚它们在多列行中的工作方式。
我在 ImGui Discord 频道得到帮助,想出了这个解决方案:
ImGui::NextColumn();
std::string text = "1";
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetColumnWidth() - ImGui::CalcTextSize(text.c_str()).x
- ImGui::GetScrollX() - 2 * ImGui::GetStyle().ItemSpacing.x);
ImGui::Text("%s", text);
与 iHowell 答案几乎相同的代码,但应根据当前位置值检查新的 x 位置,以便很好地 window-边界对齐(文本将被右剪裁)。 在代码中:
ImGui::NextColumn();
std::string text = "1";
auto posX = (ImGui::GetCursorPosX() + ImGui::GetColumnWidth() - ImGui::CalcTextSize(text.c_str()).x
- ImGui::GetScrollX() - 2 * ImGui::GetStyle().ItemSpacing.x);
if(posX > ImGui::GetCursorPosX())
ImGui::SetCursorPosX(posX);
ImGui::Text("%s", text);