Chapter 132 · XUI 基础控件

Hyperlink 超链接

Hyperlink 可点击文本控件,支持 Normal/Hover/Active/Disabled 四态颜色与下划线独立控制。

132

概念

Hyperlink 是带交互状态的文本控件:
• 鼠标悬停变色、按下变色
• 下划线可按状态独立开关
• 点击回调用于打开 URL 或触发导航
• 支持多行换行与段落间距

API 速查

函数说明
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;
}

代码讲解

  • xuiHyperlinkCreate:创建超链接控件,内置指针交互和状态切换。
  • xuiHyperlinkSetClick:注册点击回调,触发时执行导航/打开 URL。
  • xuiHyperlinkSetTextColors:一次设置四态颜色(Normal/Hover/Active/Disabled)。
  • xuiHyperlinkSetUnderline:分别控制各态是否显示下划线。
  • GetClickCount:累计点击次数,可用于“已读”标记。

要点与陷阱

  • 四态颜色:Normal/Hover/Active/Disabled 一次设置。
  • 下划线:三参数分别控制常态/悬停/按下是否显示下划线。
  • ClickCount:累计点击次数,可用于"已读"标记。
  • 与 Label 区别:Hyperlink 内置指针交互和状态切换。

进阶练习

  1. 实现"已访问"变色:点击后切换 Normal 颜色为紫色。
  2. 多行超链接段落:换行 + 段落间距组合。
Hyperlink 超链接效果
图:Hyperlink 超链接渲染效果