☰
EUI-NEO平台能力清单:托盘、文件选择、IME集成,一键打通系统能力
2026/10/8 16:46:03 网站建设 项目流程

EUI-NEO平台能力清单:托盘、文件选择、IME集成,一键打通系统能力

【免费下载链接】EUI-NEOEUI-NEO is a cross-platform, high-performance, low-overhead C++17 GPUI framework项目地址: https://gitcode.com/gh_mirrors/eui3/EUI-NEO

EUI-NEO 是一个跨平台、高性能、低开销的 C++17 GUI 框架,除了自绘 UI,它通过统一的平台能力层把托盘图标、系统文件选择对话框、输入法(IME)集成这些"系统级功能"打包成跨平台 API,让同一份代码在 Windows、macOS、Linux 上都能打通系统能力。这篇清单带你看完三大核心能力各自解决什么问题、API 长什么样、以及底层是如何实现的。

🗂 三大平台能力总览

平台能力统一通过 include/eui/platform.h 对外暴露,底层实现在 core/platform/platform.cpp。它的定位很明确:只做跨平台、非业务的系统集成,不掺业务概念。

能力核心 API解决的问题
托盘图标initializeTray/pollTray/consumeTrayShowRequested关闭窗口后最小化到托盘,双击恢复、菜单退出
文件选择openFileDialog/chooseFile/chooseFiles弹系统原生对话框选文件,支持扩展名过滤和多选
IME 集成setImeCursorRect让输入法候选框精准锚定在光标位置

此外还有openUrl(用系统默认浏览器打开链接)和resolveResourcePath(资源路径解析),都是几行就能用的小工具。

🖥 托盘图标:关闭窗口 ≠ 退出程序

桌面应用最基础的需求之一:点右上角"×"不是退出,而是收进系统托盘;鼠标悬浮托盘图标看到提示,点击菜单可以"显示主窗口"或"退出"。EUI-NEO 把这些都做成了默认行为。

框架在 core/app/glfw_app_main.cpp 的主循环里完成了整套编排:

  • 窗口初始化时调用windowState.initializeTray(),托盘图标与提示语自动就绪;
  • 用户点"×"时拦截关闭回调,改为hideToTrayRequested(释放渲染缓存、隐藏窗口,节省显存);
  • 主循环每帧pollTray轮询托盘事件,consumeTrayShowRequested()触发恢复窗口,consumeTrayExitRequested()触发真正退出。

托盘底层基于单头库 Tray(3rd/tray/tray.h、3rd/tray/README.md):Windows 用 shellapi、macOS 用 Cocoa/AppKit、Linux 用 libappindicator,一个图标三种系统通吃。桥接层 C 代码在 core/platform/tray_bridge.c。

下图是一个跑在桌面窗口中的 EUI-NEO 应用实例,这类应用默认都带托盘行为:

📂 文件选择:一次调用,三种系统原生体验

需要用户从磁盘挑文件时,自己画一个假的文件浏览器既费事又别扭。EUI-NEO 直接封装系统原生对话框:

  • Windows:Common Dialog(GetOpenFileNameW),零额外依赖;
  • macOS:osascript调用choose file;
  • Linux:优先zenity,不可用时回退kdialog,两者都缺才返回失败状态。

推荐用openFileDialog(...),因为它能区分"选中 / 取消 / 失败"三种结果;只要路径字符串时,用更简单的chooseFile/chooseFiles。完整说明见官方文档 docs/平台能力.md。

几个实用细节:

  • 扩展名过滤随便写"png"、".png"、"*.png",内部自动归一;
  • allowMultiple控制多选,initialDirectory设置初始目录;
  • 文件选择是阻塞式对话框,适合放在按钮点击回调里,别在每帧的 compose/update 中调用;
  • 目前只支持打开本地文件,暂不支持选目录和保存对话框。

Calgary Gallery 这类本地图片展示应用(源码见 apps/calgary_gallery/)就是"选文件 → 读图 → 上屏"链路的典型消费者:

⌨️ IME 集成:中文候选框精准"咬住"光标

对中文用户来说,GUI 框架最容易被诟病的就是输入法:候选框飘到窗口左上角,或者干脆不出现。EUI-NEO 通过setImeCursorRect(...)把输入框光标矩形实时同步给系统输入法,候选窗口就锚定在光标脚下。

工作机制分三层:

  1. core/runtime/runtime_input.h 在输入控件获得焦点、光标移动时计算 IME 矩形并调用平台层;
  2. 平台层经 core/window/window_backend.cpp 下发到窗口后端;
  3. Windows 上由 core/platform/ime_bridge.c 同步组合窗口与字号,框架还会在输入框内自绘预编辑组合串(提交前的拼音草稿),行中间输入时后续文字自动让位,不再叠画。

更完整的事件模型(键盘、文本、IME 预编辑分离的双通道设计)写在 docs/事件.md。看这张官方示例截图:输入框里正在输入拼音,候选词"闪闪发亮 / 珊瑚 / 姗姗……"稳稳悬浮在光标正下方——这就是setImeCursorRect的效果:

🚀 快速上手:一个头文件打通系统能力

想在自己的应用里启用这些能力,只需在页面代码中#include <eui/platform.h>:

  • 托盘、主窗口隐藏/恢复、退出:框架默认已接线,零代码;
  • 打开系统文件对话框:eui::platform::openFileDialog(...)一次调用;
  • IME 定位:只要使用input输入组件,框架自动同步光标矩形。

所有 API 均为跨平台统一签名,业务代码不需要写任何平台分支。更多集成细节可参考 docs/集成指南.md 与 docs/模块.md。

✅ 小结

能力一句话总结
托盘点"×"收进托盘,菜单恢复/退出,三大平台开箱即用
文件选择系统原生对话框 + 扩展名过滤 + 多/单选,区分选中、取消、失败
IME候选框锚定光标,输入框内自绘预编辑组合串,中文体验不缩水

这就是 EUI-NEO 平台能力清单的核心:用一套 C++17 代码,把桌面应用的"系统肌肉"一次性练满。

【免费下载链接】EUI-NEOEUI-NEO is a cross-platform, high-performance, low-overhead C++17 GPUI framework项目地址: https://gitcode.com/gh_mirrors/eui3/EUI-NEO

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询