以下为nim_duilib支持跨平台的主要事项(目前正在开发基于SDL3.0的作为窗口管理器的方案,可实现界面库的跨平台的支持)
事项 | 备注 |
---|---|
HWND | 已解决 |
HDC | 已解决 |
Win API | 已解决 |
DPI | 已解决 |
字体 | 已解决(使用Skia的字体管理器) |
UINT LRESULT, | 已解决 |
WPARAM,LPARAM | 已解决 |
按键状态 | 已解决 |
RichEdit控件 | 需要使用SDL实现,只支持基本的文本输入,待开发,是难点 |
日期控件 | 暂不支持,需要调研替代方案 |
三个Combo控件 | 已解决 |
ColorPicker截屏 | 需要使用SDL实现,待开发 |
Menu控件 | 已解决 |
消息处理 | 已解决 |
SetWindowPos | 已解决 |
Window GetHWND | 已解决 |
DragDrop | 暂不支持,需要调研替代方案 |
HotKey | 暂不支持,需要调研替代方案 |
窗口风格 | 已解决 |
窗口 | 已解决 |
窗口图标 | 已解决 |
光标 | 已解决 |
鼠标 | 已解决 |
键盘 | 已解决 |
消息接口修改 | 已解决 |
窗口接口抽象化 | 已解决 |
模块 | 源文件(Windows平台或使用Windows API) | 当前状态 | 功能说明 | 源文件(同目录,其他平台) | 备注 |
---|---|---|---|---|---|
Utils | duilib\Utils\ApiWrapper_Windows.h | 无需处理 | 只有Windows平台使用 | 不需要 | |
Utils | duilib\Utils\ApiWrapper_Windows.cpp | 无需处理 | 只有Windows平台使用 | 不需要 | |
Utils | duilib\Utils\BitmapHelper_Windows.h | 无需处理 | 只有Windows平台使用 | 不需要 | |
Utils | duilib\Utils\BitmapHelper_Windows.cpp | 无需处理 | 只有Windows平台使用 | 不需要 | |
Utils | duilib\Utils\Macros_Windows.h | 无需处理 | 只有Windows平台使用 | 不需要 | |
Utils | duilib\Utils\MonitorUtil_Windows.cpp | 已完成 | 获取DPI值 | MonitorUtil_SDL.cpp | |
Utils | duilib\Utils\FileDialog_Windows.cpp | 已完成 | FileDialog_SDL.cpp | ||
Utils | duilib\Utils\ScreenCapture_Windows.cpp | 不予支持 | SDL没有屏幕截图功能 | 目前没有方案,其他 平台不支持屏幕取色 |
|
Utils | duilib\Utils\ShadowWnd_Windows.cpp | 开发中... | 需要修改SDL,增加 WM_MOVE/WM_MOVING事件 SDL不支持修改窗口的Z-Order, 达不到预期效果 |
ShadowWnd_SDL.cpp | |
Control | duilib\Control\DateTimeWnd_Windows.h | 已完成 | DateTimeWnd_SDL.h | 自己编码实现 | |
Control | duilib\Control\DateTimeWnd_Windows.cpp | 已完成 | DateTimeWnd_SDL.cpp | 自己编码实现, 但不支持EditFormat:: kDateCalendar格式 |
|
Control | duilib\Control\PropertyGrid.cpp | 已完成 | 移除平台相关代码 | ||
Control | duilib\Control\RichEdit_Windows.h | 已完成 | RichEdit_SDL.h | 比Windows的RichEdit 控件缺少RichText功能 |
|
Control | duilib\Control\RichEdit_Windows.cpp | 已完成 | RichEdit_SDL.cpp | 自己编码实现 | |
Control | duilib\Control\RichEditCtrl_Windows.h | 无需处理 | |||
Control | duilib\Control\RichEditHost_Windows.h | 无需处理 | |||
Control | duilib\Control\RichEditHost_Windows.cpp | 无需处理 | |||
Core | duilib\Core\DpiManager.cpp | 已完成 | 移除平台相关代码 | ||
Core | duilib\Core\FontManager.cpp | 已完成 | 移除平台相关代码 | ||
Core | duilib\Core\TimerManager.h | std::condition_variable Linux平台需要pthread实现 |
|||
Core | duilib\Core\TimerManager.cpp | 已完成 | 移除平台相关代码 | ||
Core | duilib\Core\FrameworkThread.cpp和.h | 已完成 | 移除平台相关代码 | ||
Core | duilib\Core\CursorManager_Windows.cpp | 已完成 | 光标管理 | CursorManager_SDL.cpp | |
Core | duilib\Core\DpiAwareness_Windows.cpp | 已完成 | DPI感知 | DpiAwareness_SDL.cpp | 其他平台暂不支持 |
Core | duilib\Core\IconManager_Windows.h | 无需处理 | 只有Windows平台使用 | 不需要 | 其他平台不支持 |
Core | duilib\Core\IconManager_Windows.cpp | 无需处理 | 只有Windows平台使用 | 不需要 | 其他平台不支持 |
Core | duilib\Core\Keyboard_Windows.cpp | 已完成 | 键盘相关 | Keyboard_SDL.cpp Keycode_SDL.cpp |
|
Core | duilib\Core\NativeWindow_Windows.cpp | 已完成 | 窗口管理 | NativeWindow_SDL.cpp | |
Core | duilib\Core\NativeWindow_Windows.h | 已完成 | 窗口管理 | NativeWindow_SDL.h | |
Core | duilib\Core\ToolTip_Windows.cpp | 已完成 | ToolTip功能 | ToolTip_SDL.cpp | 其他平台暂不支持 |
Core | duilib\Core\WindowDropTarget_Windows.cpp | 已完成 | 拖放功能 | WindowDropTarget_SDL.cpp | 其他平台暂不支持 |
Core | duilib\Core\ThreadMessage_Windows.cpp | 已完成 | 线程间通信 | ThreadMessage_SDL.cpp | |
Core | duilib\Core\MessageLoop_Windows.h | 已完成 | 消息循环 | MessageLoop_SDL.h | |
Core | duilib\Core\MessageLoop_Windows.cpp | 已完成 | 消息循环 | MessageLoop_SDL.cpp | |
RenderSkia | duilib\RenderSkia\Bitmap_Skia.h | 已完成 | 移除平台相关代码 | 不需要 | |
RenderSkia | duilib\RenderSkia\Bitmap_Skia.cpp | 已完成 | 移除平台相关代码 | 不需要 | |
RenderSkia | duilib\RenderSkia\Render_Skia.h | 已完成 | 移除平台相关代码 | 不需要 | |
RenderSkia | duilib\RenderSkia\Render_Skia.cpp | 已完成 | 移除平台相关代码 | 不需要 | |
RenderSkia | duilib\RenderSkia\Render_Skia_Windows.h | 已完成 | 渲染引擎与窗口关联 | Render_Skia_SDL.h | |
RenderSkia | duilib\RenderSkia\Render_Skia_Windows.cpp | 已完成 | 渲染引擎与窗口关联 | Render_Skia_SDL.cpp | |
RenderSkia | duilib\RenderSkia\SkRasterWindowContext_Windows.h | 已完成 | 支持CPU渲染 | SkRasterWindowContext_SDL.h | |
RenderSkia | duilib\RenderSkia\SkRasterWindowContext_Windows.cpp | 已完成 | 支持CPU渲染 | SkRasterWindowContext_SDL.cpp | |
RenderSkia | duilib\RenderSkia\SkGLWindowContext_Windows.h | 已完成 | 支持OpenGL渲染 | 暂不支持,待调研 | |
RenderSkia | duilib\RenderSkia\SkGLWindowContext_Windows.cpp | 已完成 | 支持OpenGL渲染 | 暂不支持,待调研 | |
RenderSkia | skia\tools\gpu\gl\win\SkWGL_win.cpp | 已完成 | 支持OpenGL渲染 | 暂不支持,待调研 |
功能 | 键盘或鼠标快捷键 | 开发状态 | 备注 |
---|---|---|---|
文本存储 | 无 | 完成 | 文本分行存储,需控制内存占有率和绘制速度 |
文本修改 | 无 | 完成 | 增量修改,增量绘制,绘制速度快,不卡 |
文本选择 | 按住鼠标左键移动鼠标 | 完成 | 选择鼠标点击到移动点的范围内的文本 |
文本选择 | Shift + 鼠标左键点击 | 完成 | 选择光标到鼠标点击范围内的文本 |
文本选择 | Shift + Left键 | 完成 | 选择光标到向左逐字符扩大的范围内的文本 |
文本选择 | Shift + Right键 | 完成 | 选择光标到向右逐字符扩大的范围内的文本 |
文本选择 | Shift + Up键 | 完成 | 选择光标到向上逐行扩大的范围内的文本 |
文本选择 | Shift + Down键 | 完成 | 选择光标到向下逐行扩大的范围内的文本 |
文本选择 | Shift + Home键 | 完成 | 选择光标到行首范围内的文本 |
文本选择 | Shift + End键 | 完成 | 选择光标到行尾范围内的文本 |
文本选择 | Shift + Page Up键 | 完成 | 选择光标到向上按页逐步扩大的范围内的文本 |
文本选择 | Shift + Page Down键 | 完成 | 选择光标到向下按页逐步扩大的范围内的文本 |
光标定位 | 鼠标左键/右键单击 | 完成 | |
保持光标在可见区域 | 完成 | ||
光标向左移动一个字符 | Left键 | 完成 | |
光标向右移动一个字符 | Right 键 | 完成 | |
光标向上移动一行 | Up 键 | 完成 | |
光标向下移动一行 | Down 键 | 完成 | |
光标移到行首 | Home 键 | 完成 | |
光标移到行尾 | End 键 | 完成 | |
光标向上移动一页 | Page Up 键 | 完成 | |
光标向下移动一页 | Page Down 键 | 完成 | |
光标向左移动一个词 | Ctrl + Left键 | 完成 | |
光标向右移动一个词 | Ctrl + Right键 | 完成 | |
光标移动到文档开头 | Ctrl + Home键 | 完成 | 视图和光标同时变化 |
光标移动到文档末尾 | Ctrl + End键 | 完成 | 视图和光标同时变化 |
视图移动到上面的行 | Ctrl + Up键 | 完成 | 光标位置不变, 即ScrollBox的功能 |
视图移动到下面的行 | Ctrl + Down键 | 完成 | 光标位置不变, 即ScrollBox的功能 |
视图向上移动一页 | Ctrl + Page Up键 | 完成 | 光标位置不变, 即ScrollBox的功能 |
视图向下移动一页 | Ctrl + Page Down键 | 完成 | 光标位置不变, 即ScrollBox的功能 |
按字符向后删除 | Delete | 完成 | |
按词向后删除 | Ctrl + Delete | 完成 | 删除下一个词或所选字符 |
按字符向前删除 | Backspace | 完成 | |
按词向前删除 | Ctrl + Backspace | 完成 | 删除前一个词或所选字符 |
全选 | Ctrl+A | 完成 | |
复制 | Ctrl+C / Ctrl+Insert | 完成 | |
粘贴 | Ctrl+V / Shift+Insert | 完成 | |
剪切 | Ctrl+X | 完成 | |
撤销 | Ctrl+Z | 完成 | |
重做 | Ctrl+Y | 完成 | |
自动换行 | Ctrl+W | 完成 | 功能切换 |
缩放 | Ctrl + 鼠标滚轮 | 完成 | |
TAB键的绘制 | 完成 | TAB键对应4个空格,固定 | |
文本横向对齐方式的支持 | 完成 | ||
文本纵向对齐方式的支持 | 完成 | ||
单行文本/多行文本 | 完成 | ||
密码模式相关功能 | 完成 | ||
数字模式相关功能 | 完成 | ||
限制符数的功能 | 完成 | ||
PromptText功能 | 完成 | ||
输入字符的识别与过滤 | 完成 | 最新的SDL3.0源码,输入字符已经正常 | |
其他常规功能 | 完成 | ||
查找功能 | 完成 | ||
DPI自适应功能 | 完成 |
Linux分类 | 系统版本 | 桌面类型 | 进度 | 备注 |
---|---|---|---|---|
OpenEuler | 24.03 64位 | UKUI(X11) | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 其他问题:暂无 |
OpenEuler | 24.03 64位 | DDE (deepin,X11) | 已完成 | 中文输入:未测试,未成功安装中文输入,俄文输入法可正常输入 软键盘输入:未测试,未找到软键盘 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:否,窗口阴影显示为黑色;所以实际只能使用系统标题栏 其他问题:暂无 |
中科方德 | NFSDesktop-5.0-G230-240806 64位 | X11 | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 有偶发崩溃,与窗口有关,比如move_control等 |
开放麒麟(OpenKylin) | Desktop-V2.0 64位 | Wayland | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 程序实际使用的是X11 子窗口焦点有问题,影响部分功能,比如Combo,鼠标拖动控件操作等(子窗口弹出时,父窗口失去焦点,导致流程出错,原因未知) |
优麒麟(UbuntuKylin) | ubuntukylin-24.10-desktop 64位 | X11 | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 |
UOS | desktop-20 1070 | X11 | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 其他问题:属性页控件,选择文件/选择目录的系统框无法弹出 |
Ubuntu | 24.04.1 64位 | GNOME(Wayland) | 已完成 | 中文输入:正常 软键盘输入:未测试 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 程序实际使用的是X11 如果强制使用wayland可用运行,但效果较差,不支持DPI缩放,高DPI时界面模糊 |
Debian | 12.7.0 64位 | GNOME(Wayland) | 已完成 | 中文输入:正常 软键盘输入:未测试 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 程序实际使用的是X11 ListCtrl系统标题栏只有关闭按钮,没有最小化和最大化按钮 |
Fedora | Fedora Workstation 40 64位 | GNOME(Wayland) | 已完成 | 中文输入:正常 软键盘输入:未测试 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:是 程序实际使用的是X11 ListCtrl系统标题栏只有关闭按钮,没有最小化和最大化按钮 |
OpenSUSE | OpenSUSE-Leap-15.6 64位 | KDE(X11) | 已完成 | 中文输入:正常 软键盘输入:正常 窗口弹出时是否有黑屏现象:否 是否支持透明窗口:否,窗口阴影显示为黑色;所以实际只能使用系统标题栏 其他问题:关闭窗口的时候,会全屏黑一下,然后才关闭窗口 |
已知问题:
- 自定义(半透明,带阴影)标题栏:双击标题栏时,不能够最大化/还原操作(仅Linux平台,Windows平台是正常的)(共性问题,需要SDL底层支持才行)
- 调整窗口大小时,有黑屏现象(消息太多,导致绘制消息不能及时相应,Ubuntu环境有这个问题,大部分系统下都有,共性问题,需要SDL底层支持才行)
- 窗口最大化还原以后,不是还原到最大化前的窗口位置(原因待定位)
- 目前X11窗口基本测试完成,但Wayland窗口尚未测试