Hyperlink 可点击文本控件,支持 Normal/Hover/Active/Disabled 四态颜色与下划线独立控制。
Hyperlink 是带交互状态的文本控件:
• 鼠标悬停变色、按下变色
• 下划线可按状态独立开关
• 点击回调用于打开 URL 或触发导航
• 支持多行换行与段落间距
| 函数 | 说明 |
|---|---|
int xuiHyperlinkCreate(xui_context pCtx, xui_widget* ppW, const xui_hyperlink_desc_t* pDesc) | 创建超链接 |
int xuiHyperlinkSetClick(xui_widget pW, xui_hyperlink_click_proc onClick, void* pUser) | 点击回调 |
int xuiHyperlinkSetText(xui_widget pW, const char* sText) | 设置文本 |
int xuiHyperlinkSetTextColors(xui_widget pW, uint32_t iNormal, uint32_t iHover, uint32_t iActive, uint32_t iDisabled) | 四态颜色 |
int xuiHyperlinkSetUnderline(xui_widget pW, int bNormal, int bHover, int bActive) | 各态下划线 |
int xuiHyperlinkSetWrapMode(xui_widget pW, int iMode) | 换行模式 |
uint32_t xuiHyperlinkGetState(xui_widget pW) | 当前状态 |
int xuiHyperlinkGetClickCount(xui_widget pW) | 累计点击次数 |
gcc -O2 -I. -o ch132.exe ch132_main.c src\xui_*.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch132.exe
static void OnLinkClick(xui_widget pW, void* pUser) {
printf("Link clicked! Opening URL...\n");
}
xui_hyperlink_desc_t desc = { 0 };
desc.sText = "访问 XGE 官网";
xui_widget pLink;
xuiHyperlinkCreate(pCtx, &pLink, &desc);
xuiHyperlinkSetClick(pLink, OnLinkClick, NULL);
// 蓝色常态,悬停加下划线
xuiHyperlinkSetTextColors(pLink,
0xFF4DA6FF, 0xFF80C0FF,
0xFF2080E0, 0xFF808080);
xuiHyperlinkSetUnderline(pLink, 0, 1, 1);
xuiWidgetAddChild(pParent, pLink);将以下代码保存为 ch132_main.c,编译后运行即可看到超链接交互效果:
#include "xge.h"
#include "xui.h"
#include <stdio.h>
static xui_context g_pCtx;
static void OnLinkClick(xui_widget pW, void* pUser) {
(void)pW; (void)pUser;
printf("Link clicked! Count: %d\n",
xuiHyperlinkGetClickCount(pW));
}
static int onFrame(void* pUser) {
(void)pUser;
xgeClear(0x081114FF);
float mx, my;
xgeMouseGet(&mx, &my);
xuiInputPointerMove(g_pCtx, mx, my, 0);
if (xgeMouseDown(XGE_MOUSE_LEFT))
xuiInputPointerDown(g_pCtx, mx, my, 0, 1);
if (!xgeMouseDown(XGE_MOUSE_LEFT) /* 释放边沿建议改用事件 */)
xuiInputPointerUp(g_pCtx, mx, my, 0, 0);
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 = "ch132 - Hyperlink";
d.iFlags = XGE_INIT_VSYNC;
xgeInit(&d);
xuiCreate(&g_pCtx);
extern const xui_proxy_t tXgeProxy;
xui_proxy_t tXgeProxy = xuiProxyXge();
xuiSetProxy(g_pCtx, &tXgeProxy);
xuiSetViewportSize(g_pCtx, 800, 600);
// 创建超链接
xui_hyperlink_desc_t desc = { 0 };
desc.sText = "Visit XGE Website";
xui_widget pLink;
xuiHyperlinkCreate(g_pCtx, &pLink, &desc);
xuiHyperlinkSetClick(pLink, OnLinkClick, NULL);
xuiHyperlinkSetTextColors(pLink,
0xFF4DA6FF, 0xFF80C0FF,
0xFF2080E0, 0xFF808080);
xuiHyperlinkSetUnderline(pLink, 0, 1, 1);
xuiWidgetSetRect(pLink,
(xui_rect_t){ 300, 280, 200, 40 });
xgeRun(onFrame, NULL);
xuiDestroy(g_pCtx);
xgeUnit();
return 0;
}