Chapter 162 · XUI 弹出层与反馈

StatusBar 状态栏

StatusBar 窗口底部状态栏,支持多段文本、进度条、弹性间隔、可点击区域。

162

概念

StatusBar 是应用底部的信息条:
• 多段:左/中/右三段(Section 0/1/2)
• 文本项:状态文字,可设定宽度和可点击
• 进度条:嵌入段内的迷你进度指示
• 弹性间隔:按权重分配剩余空间
• 固定间隔:精确像素间距

API 速查

函数说明
int xuiStatusBarCreate(xui_context pCtx, xui_widget* ppW, const xui_statusbar_desc_t* pDesc)创建状态栏
int xuiStatusBarAddText(xui_widget pW, int iSection, const char* sText, float fWidth, int bClickable, int iValue)添加文本段
int xuiStatusBarAddProgress(xui_widget pW, int iSection, float fMin, float fMax, float fValue, float fWidth)添加进度条
int xuiStatusBarAddSpacer(xui_widget pW, int iSection, float fWidth)固定间隔
int xuiStatusBarAddFlexibleSpacer(xui_widget pW, int iSection, float fWeight)弹性间隔
int xuiStatusBarSetProgress(xui_widget pW, int iIndex, float fValue)更新进度值
int xuiStatusBarSetItemText(xui_widget pW, int iIndex, const char* sText)更新文本

编译本章示例

gcc -O2 -I. -o ch162.exe ch162_main.c src\xui_*.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch162.exe

示例:IDE 状态栏

xui_statusbar_desc_t desc = { 0 };

xui_widget pStatus;
xuiStatusBarCreate(pCtx, &pStatus, &desc);

// 左段:状态文本
xuiStatusBarAddText(pStatus, 0, "就绪", 120.0f, 0, 0);
xuiStatusBarAddFlexibleSpacer(pStatus, 0, 1.0f);

// 中段:进度条
xuiStatusBarAddProgress(pStatus, 1, 0.0f, 100.0f, 0.0f, 150.0f);

// 右段:行列信息(可点击跳转)
xuiStatusBarAddText(pStatus, 2, "行 1, 列 1", 100.0f, 1, 10);
xuiStatusBarAddSpacer(pStatus, 2, 8.0f);
xuiStatusBarAddText(pStatus, 2, "UTF-8", 60.0f, 1, 11);

// 更新进度
xuiStatusBarSetProgress(pStatus, 1, 65.0f);

xuiWidgetAddChild(pBottomDock, pStatus);

完整代码

将以下代码保存为 ch162_main.c,编译后运行即可看到 StatusBar 状态栏效果:

#include "xge.h"
#include "xui.h"

static xui_context g_pCtx;
static xui_widget  g_pStatus;
static float       g_fProgress = 0.0f;

static int onFrame(void* pUser) {
    (void)pUser;
    xgeClear(0x081114FF);
    /* 模拟进度增长 */
    g_fProgress += 0.5f;
    if (g_fProgress > 100.0f) g_fProgress = 0.0f;
    xuiStatusBarSetProgress(g_pStatus, 1, g_fProgress);

    xuiUpdate(g_pCtx, xgeGetDelta());
    xuiLayout(g_pCtx);
    xuiRender(g_pCtx, NULL, NULL, 0);
    return XGE_OK;
}

int main(void) {
    xge_desc_t d = {0};
    d.iWidth = 800; d.iHeight = 600;
    d.sTitle = "ch162 - StatusBar";
    d.iFlags = XGE_INIT_VSYNC;
    xgeInit(&d);
    xuiCreate(&g_pCtx);
    /* XGE 官方代理由 xuiProxyXge() 提供 */
    xui_proxy_t tXgeProxy = xuiProxyXge();
xuiSetProxy(g_pCtx, &tXgeProxy);
    xuiSetViewportSize(g_pCtx, 800, 600);

    xui_widget pRoot;
    xuiPanelCreate(g_pCtx, &pRoot, NULL);
    xuiWidgetSetRect(pRoot, (xui_rect_t){0, 0, 800, 600});

    /* 状态栏 */
    xui_statusbar_desc_t sbDesc = {0};
    xuiStatusBarCreate(g_pCtx, &g_pStatus, &sbDesc);
    xuiWidgetSetRect(g_pStatus, (xui_rect_t){0, 570, 800, 30});
    xuiWidgetSetRect(g_pStatus, (xui_rect_t){0, 0, 800, 30});

    /* 左段:状态文本 */
    xuiStatusBarAddText(g_pStatus, 0, "就绪", 120.0f, 0, 0);
    xuiStatusBarAddFlexibleSpacer(g_pStatus, 0, 1.0f);

    /* 中段:进度条 */
    xuiStatusBarAddProgress(g_pStatus, 1, 0.0f, 100.0f, 0.0f, 150.0f);

    /* 右段:行列信息 */
    xuiStatusBarAddText(g_pStatus, 2, "行 1, 列 1", 100.0f, 1, 10);
    xuiStatusBarAddSpacer(g_pStatus, 2, 8.0f);
    xuiStatusBarAddText(g_pStatus, 2, "UTF-8", 60.0f, 1, 11);

    xuiWidgetAddChild(pRoot, g_pStatus);

    xgeRun(onFrame, NULL);
    xuiDestroy(g_pCtx);
    xgeUnit();
    return 0;
}

代码讲解

  • xuiStatusBarCreate:创建状态栏控件,放置在窗口底部。
  • AddText(Section 0):左段显示状态文本,FlexibleSpacer 填充剩余空间。
  • AddProgress(Section 1):中段嵌入进度条,每帧更新进度值。
  • AddText(Section 2):右段显示行列信息,bClickable=1 可点击。
  • SetProgress:帧循环中动态更新进度条值,模拟加载过程。

要点与陷阱

  • Section:0=左, 1=中, 2=右,各段独立排列。
  • Index:AddText/AddProgress 返回全局索引,用于后续更新。
  • Clickable:可点击段触发事件(如切换编码、跳转行列)。
  • 布局:StatusBar 通常放在 Dock 底部,高度自适应。

进阶练习

  1. 编译状态栏:左段显示编译消息,中段进度条,右段错误/警告计数。
  2. 动态段:根据当前编辑文件类型切换右段显示内容。
StatusBar 状态栏效果
图:StatusBar 状态栏渲染效果