4 个版本 (2 个稳定版)
1.0.1 | 2024 年 4 月 19 日 |
---|---|
0.2.0 | 2024 年 4 月 17 日 |
0.1.0 | 2024 年 4 月 16 日 |
720 在 算法 中
每月 92 次下载
110KB
742 行
Wintab; 轻轻 Rusted
定义了一组最小的类型,以便 Rust 与 Wintab 一起工作。
1. 许可证
原始的 Wintab 标题和文档由 Wacom 标有版权声明。请参阅 这里 和 这里。Wacom 提供的示例代码是 MIT 许可的 这里
2. 示例
2.1. 使用 winit
和 libloading
功能
cargo run --example winit_libloading --features="libloading"
用法
- 按键盘上的
space
清除视图。 - 只有 Wintab 输入会导致绘制任何内容。鼠标不会做任何事情。
注意
-在 winit
中工作,原生 wintab
事件(例如 WT_PACKET
)不可用。
- 幸运的是,
wintab
支持轮询方法并保持一个带时间戳的事件队列。这意味着我可能能够在bevy
中实现它,只要插件让我有hwnd
:P winit
项目正在重构事件循环的工作方式。希望他们能考虑到在新系统中提供lparam
和wparam
。
2.2. 使用 windows
和 raw-dylib
功能
cargo run --example windows_raw_dylib --features="raw-dylib"
用法
- 按键盘上的
space
清除视图。 - 只有 Wintab 输入会导致绘制任何内容。鼠标不会做任何事情。
注意
- 在编译时使用
#[link(name="Wintab32", kind = "raw-dylib")]
链接到 "Wintab32.dll"。- 这样做的好处是大大简化了您代码中外部函数的使用。
- 但这也意味着它只能在安装了Wintab32.dll的Windows系统上编译,如果Wintab32变得不可用,则您的软件将崩溃而不是能够启动并向用户显示一个有意义的错误消息。
- 这可能适用于那些蹩脚的个人项目。我认为libloading是大多数其他事情的正确选择。
- 调用
SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)
对于避免数小时痛苦的调试缩放问题至关重要!
3. 限制
- 并非所有外部函数都已移植。
- 例如,
WTEnable
目前缺失,但我可能会在未来的更新中添加它。 WTMgrOpen
缺失,但我没有兴趣添加它,因为我认为除非您正在为您的平板设备编写配置工具或进行真正奇怪的高级操作,否则不需要它。PR欢迎。
- 例如,
libloading
并不一定是最优选择...还有一些其他选择。我希望找到一种支持它们的方法,但我不确定如何。- 示例在我的硬件上运行良好,但我没有严格遵循文档中的所有指导,因此边缘情况和其他硬件可能需要一些额外的代码来正确配置LOGCONTEXT对象。
- 例如,我发现默认的LOGCONTEXT对象已经大部分按照需要配置。文档给我的印象是需要更多的设置步骤;例如,手动测量虚拟屏幕的大小并使用它来配置
LOGCONTEXT
对象。然而,我发现LOGCONTEXT对象通常到达时已经正确预配置,因此示例中的大部分设置可能是多余的。或者这可能值得做以确保不同硬件之间的兼容性?
- 例如,我发现默认的LOGCONTEXT对象已经大部分按照需要配置。文档给我的印象是需要更多的设置步骤;例如,手动测量虚拟屏幕的大小并使用它来配置
4. 替代方案
4.1. 使用 bindgen
和 wintab.h
这个crate的替代方案是使用 bindgen 和原始的 wintab.h
头文件,这些文件可在 此处 获取。我没有在这个方法上得到很好的结果。
- 生成了大量的多余代码。
- 缺少有用的特质定义。
- 坐标以独立的struct字段形式表示,而不是打包到
XYZ
结构中。 - 枚举以独立的const声明表示,而不是使用rust
enum
或使用bitflags
crate。
4.2. octotablet
crate
请查看 octotablet 项目。在编写本文时,此crate的目标是将其封装在 octotablet
中。目前,octotablet
已经提供了Windows Ink功能和对其他平台的支持。
我在我的Windows 11机器上使用Windows Ink没有取得好结果,因此我开始了这个crate的工作。
依赖项
~128MB
~2M SLoC