FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
ftxui / screen

title-img

ftxui::screen 模块是底层的核心。它可以独立使用,但主要设计用于与 ftxui::domftxui::component 模块一起使用。

它提供了一个 ftxui::Screen。


ftxui::Screen

ftxui::Screen 类表示一个二维的样式化字符网格,可以渲染到终端。 它提供了创建屏幕、访问像素和渲染元素的方法。

您可以使用 ftxui::Screen::PixelAt 方法访问屏幕的单个单元格 (ftxui::Pixel),该方法返回指定坐标处像素的引用。

示例

void main() {
auto screen = ftxui::Screen::Create(
ftxui::Dimension::Full(), // 使用终端的全部宽度
ftxui::Dimension::Fixed(10) // 固定高度为10行
);
// 访问 (10, 5) 处的特定像素
auto& pixel = screen.PixelAt(10, 5);
// 设置像素的属性。
pixel.character = U'X';
pixel.foreground_color = ftxui::Color::Red;
pixel.background_color = ftxui::Color::RGB(0, 255, 0);
pixel.bold = true; // 设置粗体样式
screen.Print(); // 将屏幕打印到终端
}
static Screen Create(Dimensions dimension)
Create a screen with the given dimension.
Definition screen.cpp:394
static Color RGB(uint8_t red, uint8_t green, uint8_t blue)
Build a Color from its RGB representation. https://en.wikipedia.org/wiki/RGB_color_model.

‍[!note] 如果坐标超出范围,将返回一个虚拟像素。

屏幕可以使用 ftxui::Screen::Print() 打印到终端,或者使用 ftxui::Screen::ToString() 转换为 std::string。

  • Print()
    auto screen = ...;
    screen.Print();
  • ToString()
    auto screen = ...;
    std::cout << screen.ToString();

请注意,您可以在打印后通过调用 ftxui::Screen::ResetCursorPosition() 将光标位置重置到屏幕的左上角。

示例

auto screen = ...;
while(true) {
// 绘图操作:
...
// 将屏幕打印到终端。然后重置光标位置和屏幕内容。
std::cout << screen.ToString();
std::cout << screen.ResetCursorPosition(/*clear=*/true);
std::cout << std::flush;
// 暂停一小段时间以控制刷新率。
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

ftxui::Dimension

ftxui::Dimension 工具控制屏幕尺寸:

  • Dimension::Full() — 使用终端的全部宽度或高度
  • Dimension::Fit(element) — 调整大小以适应渲染的 ftxui::Element
  • Dimension::Fixed(n) — 精确使用 n 列或行

这些值将传递给 ftxui::Screen::Create()

ftxui::Screen::Create() 提供了两个重载:

  • Screen::Create(Dimension) 将宽度和高度设置为相同类型的维度
  • Screen::Create(Dimension width, Dimension height) 允许按轴进行不同的控制
auto screen = ftxui::Screen::Create(
ftxui::Dimension::Full(), // 宽度
ftxui::Dimension::Fixed(10) // 高度
);

创建后,渲染一个元素并显示结果:

ftxui::Render(screen, element);
screen.Print();

ftxui::Pixel

屏幕网格中的每个单元格都是一个 ftxui::Pixel,它包含:

  • Unicode 码点。
    • character
  • ftxui::Color:
    • foreground_color
    • background_color
  • 布尔值:
    • blink (闪烁)
    • bold (粗体)
    • dim (暗淡)
    • italic (斜体)
    • inverted (反转前景色和背景色)
    • underlined (下划线)
    • underlined_double (双下划线)
    • strikethrough (删除线)
auto screen = ftxui::Screen::Create(
ftxui::Dimension::Fixed(5),
ftxui::Dimension::Fixed(5),
);
auto& pixel = screen.PixelAt(3, 3);
pixel.character = U'X';
pixel.bold = true;
pixel.foreground_color = ftxui::Color::Red;
pixel.background_color = ftxui::Color::RGB(0, 255, 0);
screen.Print();

‍[!note] PixelAt(x, y) 执行边界检查并返回指定坐标处像素的引用。如果超出边界,则返回一个虚拟像素引用。

屏幕中的每个单元格都是一个 ftxui::Pixel。您可以使用以下方法修改它们:

auto& pixel = screen.PixelAt(x, y);
pixel.character = U'X';
pixel.bold = true;
pixel.foreground_color = Color::Red;

ftxui::Color

ftxui::Color 类用于定义每个 ftxui::Pixel 的前景色和背景色。

它支持各种颜色空间和预定义调色板。如果终端不支持请求的颜色,FTXUI 将动态回退到终端中最接近的可用颜色。

颜色空间

‍[!note] 您可以使用 ftxui::Terminal::ColorSupport() 查询终端功能;

这可以通过 ftxui::Terminal::SetColorSupport() 手动设置。