Chapter 138 · XUI 基础控件

Input 输入框

Input 单行文本输入,支持占位符、密码模式、前后装饰、选区操作、撤销重做与右键菜单。

138

概念

Input 是最常用的文本输入控件:
• Placeholder:空内容时显示提示文字
• Password:密码模式,字符显示为圆点
• Decoration:前置/后置装饰(图标、按钮、文本)
• 选区:支持全选、复制、剪切、粘贴
• 撤销/重做:内置操作历史栈

API 速查

函数说明
int xuiInputCreate(xui_context pCtx, xui_widget* ppW, const xui_input_desc_t* pDesc)创建输入框
int xuiInputSetChange(xui_widget pW, xui_input_change_proc onChange, void* pUser)内容变化回调
int xuiInputSetText(xui_widget pW, const char* sText)设置文本
const char* xuiInputGetText(xui_widget pW)获取文本
int xuiInputSetPlaceholder(xui_widget pW, const char* sText)占位提示
int xuiInputSetPassword(xui_widget pW, int bPassword)密码模式
int xuiInputSetMaxLength(xui_widget pW, int iMax)最大长度
int xuiInputSetReadonly(xui_widget pW, int bReadonly)只读模式
int xuiInputSetError(xui_widget pW, int bError)错误状态
int xuiInputSelectAll(xui_widget pW)全选
int xuiInputDecorationAdd(xui_widget pW, int iSide, xui_input_decoration* ppDec, const xui_input_decoration_desc_t* pDesc)添加装饰
int xuiInputUndo(xui_widget pW)撤销
int xuiInputRedo(xui_widget pW)重做

编译本章示例

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

示例:登录表单

// 用户名输入框(带前置图标)
xui_input_desc_t userDesc = { 0 };
userDesc.sPlaceholder = "请输入用户名";

xui_widget pUserInput;
xuiInputCreate(pCtx, &pUserInput, &userDesc);
xuiInputSetMaxLength(pUserInput, 32);

// 前置图标装饰
xui_input_decoration pDec;
xuiInputDecorationAdd(pUserInput, 0, &pDec,
    &(xui_input_decoration_desc_t){
        .pSurface = pIconSurf, .tSrc = tUserIcon });

// 密码输入框
xui_input_desc_t passDesc = { 0 };
passDesc.sPlaceholder = "请输入密码";

xui_widget pPassInput;
xuiInputCreate(pCtx, &pPassInput, &passDesc);
xuiInputSetPassword(pPassInput, 1);

// 验证失败时显示错误态
xuiInputSetError(pPassInput, 1);

完整代码

将以下代码保存为 ch138_main.c,编译后运行即可看到输入框效果:

#include "xge.h"
#include "xui.h"
#include <stdio.h>

static xui_context g_pCtx;

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  = "ch138 - Input";
    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_input_desc_t userDesc = { 0 };
    userDesc.sPlaceholder = "Username";
    xui_widget pUser;
    xuiInputCreate(g_pCtx, &pUser, &userDesc);
    xuiInputSetMaxLength(pUser, 32);
    xuiWidgetSetRect(pUser,
        (xui_rect_t){ 250, 220, 300, 40 });

    // 密码输入框
    xui_input_desc_t passDesc = { 0 };
    passDesc.sPlaceholder = "Password";
    xui_widget pPass;
    xuiInputCreate(g_pCtx, &pPass, &passDesc);
    xuiInputSetPassword(pPass, 1);
    xuiWidgetSetRect(pPass,
        (xui_rect_t){ 250, 280, 300, 40 });

    xgeRun(onFrame, NULL);

    xuiDestroy(g_pCtx);
    xgeUnit();
    return 0;
}

代码讲解

  • xuiInputCreate:创建输入框,desc 设置占位提示文本。
  • xuiInputSetPassword:密码模式,字符显示为圆点。
  • xuiInputSetMaxLength:限制最大输入长度,0=不限制。
  • xuiInputSetPlaceholder:空内容时显示灰色提示文本。
  • 内置功能:支持选区、复制粘贴、撤销重做。

要点与陷阱

  • Decoration Side:0=前置(左),1=后置(右)。
  • Error 状态:边框变红,可配合 ErrorColors 自定义。
  • MaxLength:0 表示不限制。
  • Change 回调:每次文本变化触发,编程 SetText 也触发。

进阶练习

  1. 搜索框:后置清除按钮装饰 + 实时过滤。
  2. 密码可见切换:后置眼睛图标切换 Password 模式。
Input 输入框效果
图:Input 输入框渲染效果