输入框 TextInput
输入框是我们和程序“对话”最常用的方式之一。在 HiEasyX 里,TextInput 提供了一个功能完整的多行文本编辑器,支持光标、选区、滚动条,还有原生的 IME 中文输入。
如果你只需要一行简单的输入框,TextInput 同样能胜任——默认高度足以容纳单行,竖直滚动条会在内容溢出时自动出现。
函数原型
void TextInput(TextInputProfile &Profile);
参数说明
TextInput 只有一个参数,但这是一个“资料结构体”,里面打包了所有你需要控制的行为和外观。记得把它声明为 static 或全局变量,否则每帧都会丢失你刚刚输入的文字!
TextInputProfile
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Text | HXString | "" | 当前输入的文本内容。会被控件实时修改。 |
Size | HXPoint | {400, 300} | 输入框的宽高。宽度和高度都可以是 -1 表示自动填充剩余空间。 |
Where | HXPoint | {0, 0} | 相对于当前窗口的偏移。通常由布局系统自动计算,无需手动设置。 |
SelectingPoint | int | 0 | 选区的结束位置(字符索引)。内部状态,不需要手动初始化。 |
DisplayCursor | bool | true | 是否显示光标。如果你需要纯静态文本展示,可以设为 false。 |
Cursors | int | 0 | 当前光标所在字符索引。内部状态。 |
MouseStyle | HXMouseStyle | Normal | 鼠标悬停时的样式。内部会根据状态自动切换为 IBeam。 |
OnFocus | bool | false | 当前输入框是否拥有焦点。内部状态。 |
InDrag | bool | false | 是否正在用鼠标拖拽选区。内部状态。 |
VerticalVPer | float | 0.0f | 竖直滚动百分比(0.0 ~ 1.0)。内部状态。 |
HorizontalVPer | float | 0.0f | 水平滚动百分比。内部状态。 |
VerticalButton | bool | false | 竖直滚动条按钮是否被按下。内部状态。 |
HorizontalButton | bool | false | 水平滚动条按钮是否被按下。内部状态。 |
InIMEComposition | bool | false | 是否处于 IME 拼音/五笔等组合输入状态。内部状态。 |
IMELastRect | HXRect | — | 上次 IME 候选窗的位置。内部状态。 |
ReadOnly | bool | false | 是否只读。设为 true 后,用户无法编辑,但仍然可以选中和复制。 |
LastClickTime | DWORD | 0 | 上次点击时间戳,用于双击选词。内部状态。 |
FontSize | int | 16 | 字体大小。 |
LineGap | int | 3 | 行间距,单位是像素。 |
PaddingX | int | 10 | 左右内边距。 |
CursorBlinkMs | int | 500 | 光标闪烁周期,单位毫秒。 |
当文本内容超出 Size 时,竖直滚动条会自动出现;如果某一行特别长,水平滚动条也会出现。滚动状态完全由控件内部维护,你不需要操心。
TextInputProfile 必须是 static 或全局变量。如果你把它声明在函数内部且不加 static,每帧都会重新构造,Text 永远为空,看起来就像“键盘失灵”一样。这是 IMGUI 的典型陷阱,新手很容易踩!
返回值
void。但注意,Profile.Text 会被控件实时修改,你下次读取它就能得到用户输入的内容。
完整示例
#include <include/hex.h>
#include <include/impl/EasyX/hex_impl_easyx.h>
// 全局资料结构体,确保生命周期跨帧
static HX::TextInputProfile g_inputProfile;
int main() {
static HX::WindowProfile wp;
// 初始化输入框内容
g_inputProfile.Text = HXStr("在这里输入文字...\n支持多行!");
g_inputProfile.Size = {400, 200};
g_inputProfile.FontSize = 18;
while (true) {
HX::HXBegin();
ExMessage msg;
while (peekmessage(&msg)) {
HX::PushMessage(HX::GetHXMessage(&msg));
}
HX::Window(HXStr("TextInput 示例"), wp);
HX::Text(HXStr("请输入你的备注:"));
HX::TextInput(g_inputProfile);
HX::End();
HX::Render();
}
return 0;
}
只读模式
有时候我们只想展示一段代码或日志,不希望用户误触修改。这时开启 ReadOnly 即可:
static HX::TextInputProfile g_logProfile;
g_logProfile.ReadOnly = true;
g_logProfile.Text = HXStr("[系统日志]\n程序已启动...\n加载完成。");
只读模式下:
- 键盘输入无效
- 鼠标可以选中文本(方便复制到剪贴板)
- 滚动条依然可用
IME 中文输入
HiEasyX 对 Windows IME 有原生支持。当你在输入框里按下拼音键时,底部会出现候选条,按空格或数字即可上屏。这一切都不需要你做额外配置,只要系统输入法正常工作即可。
IME 候选窗会自动跟随光标位置,所以即使你滚动了文本,候选窗依然出现在正确的字符旁边。
常见疑问
Q:我想限制输入长度怎么办?
目前 TextInput 没有内置 MaxLength,你可以在读取 Profile.Text 后用 substr 截断,或者在业务层做校验。
Q:如何高亮代码?
TextInput 是纯文本输入控件,不带语法高亮。如果你需要代码编辑功能,可以查看 TextEditor 控件。
运行效果
截图占位符:请补充 $name 控件的运行效果截图。
截图占位符:请补充
TextInput 运行效果的运行效果截图,保存为./assets/TextInput_view.png。`n