使用有序输入事件统一处理普通文本、输入法组合态和提交态;示例以可重复的事件回放验证 UTF-8 与 IME 流程。
完成后,你可以在一个文本控件中消费 xgeInputEventGet 的顺序事件,区分已提交文本与 IME 预编辑文本,并理解为什么一个控件不能同时消费有序事件和旧式 xgeTextGet / xgeImeEventGet。
| 事件 | 写入位置 | 说明 |
|---|---|---|
XGE_EVENT_TEXT | 文档 | 已转换的 Unicode 码点;示例编码为 UTF-8 后追加。 |
XGE_EVENT_IME_UPDATE | 组合态覆盖层 | 正在候选的文本,不应直接写入文档。 |
XGE_EVENT_IME_COMMIT | 文档 | 确认的 UTF-8 字节序列;提交后清除组合态。 |
XGE_EVENT_IME_END | 组合态覆盖层 | 取消或完成组合;始终清除临时显示。 |
gcc -O2 -Wall -Wextra -DXGE_DLL -DXGE_DEBUGMODE=0 -I. -o build\ch117_main1.exe examples\tutorial_capture\ch117_main1.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
# 断言事件顺序,并在两个无人工交互的帧后退出
build\ch117_main1.exe --frames 2
# 由同一个可执行文件生成本页截图
build\ch117_main1.exe --capture tutorial\img\ch117_1.png程序首帧回放五个合成事件:TEXT('A')、IME_START、IME_UPDATE("ni")、IME_COMMIT("你好")、IME_END。它按真实输入相同的公开队列接口消费事件,只有当事件数为 5、最终文档为 A你好、组合态为空时才以成功退出。

xge_input_event_t event;
while (xgeInputEventGet(&event) > 0) {
switch (event.iType) {
case XGE_EVENT_TEXT:
append_codepoint(committed, sizeof(committed), event.iCodepoint);
break;
case XGE_EVENT_IME_UPDATE:
// sText 只在下一次 xgeInputEventGet 前有效,立即复制。
copy_utf8(composing, sizeof(composing), event.sText, event.iTextSize);
break;
case XGE_EVENT_IME_COMMIT:
append_utf8(committed, event.sText, event.iTextSize);
composing[0] = '\0';
break;
case XGE_EVENT_IME_END:
composing[0] = '\0';
break;
}
}权威、可构建的完整代码位于 examples/tutorial_capture/ch117_main1.c。它包含 UTF-8 码点编码、事件回放、断言、字体加载、离屏渲染和截图;上方片段只保留输入控件最关键的消费逻辑。
xgeImeSetEnabled(1);失焦时关闭,避免无焦点控件接管系统 IME。xgeInputEventGet 返回的 sText 在下一次读取事件后失效,因此不能把它直接保存为控件状态。xgeTextGet 与 xgeImeEventGet 是兼容视图;同一控件只能选一种模型。iCursor、iSelectStart 和 iSelectEnd 显示选择范围。