Input 单行文本输入,支持占位符、密码模式、前后装饰、选区操作、撤销重做与右键菜单。
Input 是最常用的文本输入控件:
• Placeholder:空内容时显示提示文字
• Password:密码模式,字符显示为圆点
• Decoration:前置/后置装饰(图标、按钮、文本)
• 选区:支持全选、复制、剪切、粘贴
• 撤销/重做:内置操作历史栈
| 函数 | 说明 |
|---|---|
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;
}