StatusBar 窗口底部状态栏,支持多段文本、进度条、弹性间隔、可点击区域。
StatusBar 是应用底部的信息条:
• 多段:左/中/右三段(Section 0/1/2)
• 文本项:状态文字,可设定宽度和可点击
• 进度条:嵌入段内的迷你进度指示
• 弹性间隔:按权重分配剩余空间
• 固定间隔:精确像素间距
| 函数 | 说明 |
|---|---|
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
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;
}