标签页 Tab
标签页(Tab)是现代界面里组织内容的利器:一个窗口里塞下十几页内容,用户点一下标签就能切换,既省空间又清晰。HiEasyX 的 TabBar + TabItem 组合让你轻松实现这一效果。
函数原型
标签页由两层结构组成:外层是 TabBar(标签栏),内层是 TabItem(单个标签页)。
// 标签栏(外层容器)
bool BeginTabBar(const HXString &Id, TabBarProfile &Profile);
void EndTabBar();
// 标签项(内层页面)
bool BeginTabItem(const HXString &Title, TabItemProfile &Profile);
void EndTabItem();
参数说明
TabBarProfile
TabBarProfile 控制整个标签栏的外观和行为:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
ActiveTab | int | 0 | 当前激活的标签页索引。会被控件修改。 |
FontSize | int | 20 | 标签文字的字体大小。 |
TabMinHeight | int | 28 | 每个标签页的最小高度。 |
HorizontalPadding | int | 16 | 标签文字左右内边距。 |
VerticalPadding | int | 6 | 标签文字上下内边距。 |
CloseButtonWidth | int | 20 | 关闭按钮的宽度。设为 0 可隐藏关闭按钮。 |
KeyboardSwitching | bool | false | 是否启用键盘 Ctrl+Tab / Ctrl+Shift+Tab 切换标签。 |
TabItemProfile
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Active | bool | false | 该标签页是否处于激活状态。内部状态,通常不需要手动设置。 |
BeginTabItem 返回 bool:只有当该标签页被选中时,才返回 true。这意味着你可以把一整页的内容放在 if 语句里,未被选中的页面不会执行任何绘制逻辑,性能上非常友好。
TabBarProfile 必须是 static 或全局变量。ActiveTab 需要在帧与帧之间保持记忆,如果每帧都重置为 0,用户永远也切不到第二页。
返回值
| 函数 | 返回值 | 说明 |
|---|---|---|
BeginTabBar | bool | 是否成功创建标签栏。通常恒为 true。 |
BeginTabItem | bool | 该标签页当前是否被选中。是则渲染其内部内容。 |
EndTabBar / EndTabItem | void | — |
完整示例
#include <include/hex.h>
#include <include/impl/EasyX/hex_impl_easyx.h>
// 全局资料结构体
static HX::TabBarProfile g_tabBar;
static HX::TabItemProfile g_tabPage1;
static HX::TabItemProfile g_tabPage2;
static HX::TabItemProfile g_tabPage3;
int main() {
static HX::WindowProfile wp;
// 开启键盘快捷键切换
g_tabBar.KeyboardSwitching = true;
g_tabBar.CloseButtonWidth = 20;
while (true) {
HX::HXBegin();
ExMessage msg;
while (peekmessage(&msg)) {
HX::PushMessage(HX::GetHXMessage(&msg));
}
HX::Window(HXStr("Tab 示例"), wp);
if (HX::BeginTabBar(HXStr("main_tabs"), g_tabBar)) {
// ---- 第 1 页:基本信息 ----
if (HX::BeginTabItem(HXStr("基本信息"), g_tabPage1)) {
HX::Text(HXStr("用户名:HelloWorld"));
HX::Text(HXStr("等级:Lv.42"));
HX::EndTabItem();
}
// ---- 第 2 页:设置 ----
if (HX::BeginTabItem(HXStr("设置"), g_tabPage2)) {
static HX::CheckboxProfile chk;
chk.Checked = true;
HX::Checkbox(HXStr("开机自启动"), chk);
static HX::SliderProfile1f sld;
HX::Slider1f(HXStr("音量"), g_volume, sld);
HX::EndTabItem();
}
// ---- 第 3 页:关于 ----
if (HX::BeginTabItem(HXStr("关于"), g_tabPage3)) {
HX::Text(HXStr("HiEasyX 是一个基于 EasyX 的 IMGUI 框架。"));
HX::Text(HXStr("版本:v1.0.0"));
HX::EndTabItem();
}
HX::EndTabBar();
}
HX::End();
HX::Render();
}
return 0;
}
当 CloseButtonWidth > 0 时,每个标签页右侧会出现一个小 ×。点击它可以关闭该标签页。如果你不想让用户关闭某个特定页面,目前可以通过把 CloseButtonWidth 设为 0 全局关闭,或者在外部逻辑中重新添加被关闭的页面。
键盘切换
开启 KeyboardSwitching = true 后,用户可以按:
Ctrl + Tab— 切换到下一页Ctrl + Shift + Tab— 切换到上一页
这在多文档编辑器(IDE)场景下非常顺手。
常见疑问
Q:标签页太多,一行放不下了怎么办?
目前 HiEasyX 的 TabBar 不支持自动折叠或多行标签。如果标签过多,建议考虑用 TreeView 做侧边栏导航,或者分页加载。
Q:如何动态添加/删除标签页?
TabBar 本身不限制标签页数量。你可以在 BeginTabBar 和 EndTabBar 之间用循环动态生成 BeginTabItem。但注意删除标签后,ActiveTab 索引可能会越界,你需要手动修正。
运行效果
截图占位符:请补充 $name 控件的运行效果截图。
截图占位符:请补充
Tab 运行效果的运行效果截图,保存为./assets/Tab_view.png。`n