入门问题
在哪里可以找到 Wintab 的示例代码?
使用 Wintab 有很多示例代码示例。您可以在 GitHub 上找到这些示例的链接:https://github.com/Wacom-Developer/wacom-device-kit-windows。
为什么我突然停止接收来自平板电脑的 WT_PACKET 消息或似乎只收到部分平板电脑数据包?
您可能丢失了平板电脑数据包,因为您上下文的数据包队列已溢出。每个 Wintab 上下文都有一个 tablet 数据包队列。Wintab 仅将新数据包添加到队列中,并在队列未满时向您的应用程序发送 WT_PACKET 消息。如果队列已满,Wintab 会丢弃该数据包,并且不会向您的应用程序发送 WT_PACKET 消息来告诉您您的上下文收到了一个 tablet 数据包。
您可以通过在收到 WT_PACKET 消息时始终从队列中删除数据包以及在收到 WT_PROXIMITY 消息时刷新队列来帮助防止队列溢出。
您可以通过调用以下命令刷新队列:
WTPacketsGet(hWintabContext, VALUE_LARGER_THAN_YOUR_QUEUE_SIZE, NULL);
或者WTPacket(hWintabContext, wPacketSerialNumber, NULL);
为什么在我的应用程序运行时使用平板电脑时屏幕光标移动/不移动?
逻辑上下文的 lcOptions 字段的 CXO_SYSTEM 位控制 Wintab 是否在上下文接收到 tablet 数据时移动系统指针(屏幕光标)。如果未设置此位,则当您的应用程序处于活动状态时,Wintab 将不会移动系统光标。如果您使用 WTInfo(WTI_DEFCONTEXT, …) 来获取用于创建您自己的上下文的上下文信息,CXO_SYSTEM 将被清除,除非您在调用 WTOpen() 之前设置它。
LOGCONTEXT wintabLogicalContext;
wWTInfoRetVal = WTInfo(WTI_DEFSYSCTX, 0, &wintabLogicalContext);
wintabLogicalContext.lcOptions |= CXO_SYSTEM;
hWintabContext = WTOpen(hWnd, &wintabLogicalContext, TRUE);
如果您使用 WTInfo(WTI_DEFSYSCTX,...) 获取用于创建您自己的上下文的上下文信息,则将设置 CXO_SYSTEM 并且当您的应用程序处于活动状态时光标将移动。
获取特定数据的问题
如何判断连接的数位板是否为 Wacom 数位板?
无法判断连接的数位板是否真的是 Wacom 数位板。好消息是您不需要这样做,因为使用 WTInfo() 函数可以让您找到数位板支持的数据项以及它们的范围。
我如何知道正在使用哪种 Wacom 数位板型号?
无法判断机器上安装了哪种平板电脑型号。这种有意的抽象允许编写应用程序以与任何设备一起工作。
如何获取笔高度、方位角和扭曲数据?
标准的 Pro Pen 或 Pro Pen 2 应该可以为您提供高度和方位角。我们开发人员网站上的Wintab TiltTest 演示展示了如何执行此操作的示例。如果您使用艺术笔,您将只能获得扭曲数据,这可以从同一个应用程序中验证。
我怎样才能知道插入了多少(如果有)平板电脑?
WTInfo(WTI_INTERFACE, IFC_NDEVICES, &numDevices) 将返回连接的平板电脑的数量或零。
Wintab 是否支持 WTX_TILT?
不,我们的 Wintab 实现不支持 WTX_TILT 扩展。然而,大多数现代笔会为您提供高度和方位角,您可以从中计算倾斜度(参见 Wintab TiltTest 演示)。
为什么我不能获得完整的平板电脑扩展值范围?
平板电脑在绘图区域周围的边缘下方有一小部分平板电脑活动区域。这有助于显着提高数位板边缘的笔精度。
如何获得 Wacom 数位板的低级接口文档?
您通常不能这样做,因为这是专有信息,只能根据保密协议 (NDA) 发布。您应该不需要此类信息,因为 Wintab 支持获取 Tablet 笔数据而无需低级详细信息。
我使用什么 Wintab 函数来检索 PACKETEXT 数据?
如果您的应用程序已设置为检索 PACKETEXT 数据,请使用 WTPacket() 查询数据以响应 WT_PACKETEXT 消息。有关示例,请参阅 Wintab Tablet Controls 示例代码。
我的应用程序能否通过 Wintab 检索平板电脑到屏幕的用户首选项映射?
不,Wintab 竭尽全力隐藏该映射,这允许应用程序不必为在应用程序上下文之外设置的首选项处理平板电脑到屏幕的映射。Wintab 支持让应用程序随心所欲地设置其平板电脑到屏幕的映射——这会覆盖首选项设置。
为什么 Win32 函数 GetRawInputData() 不适用于 Wacom 数位板?
此功能不起作用,因为它无法读取数位板驱动程序的自定义笔数据集合。
兼容性问题
WinTab 可以用于 UWP 应用程序吗?
由于 UWP 的限制,没有。在这种情况下,我们建议改用Windows Ink API。
我可以使用 .NET InkCollector 对象从我的平板电脑获取笔数据吗?
是的,请参阅Windows Ink API 了解更多信息。
如何将平板电脑数据用于 Web 应用程序?
您可以使用 HTML5 指针事件或 WILL SDK 来提取笔位置、压力、旋转、方向和倾斜数据。有关详细信息,请参阅Web API 。
是否有 Wintab .NET API?
现在有一个用于 Wintab 的 .NET API。您可以访问Wintab .NET API,其中包括文档和示例代码。
一般的问题
如果用户使用 Wacom 数位板属性来自定义我的应用程序或工具(例如,仅将数位板的一部分设置为活动状态),则自定义设置始终会影响我的应用程序。这是设计上的错误吗,我可以阻止它吗?
我们产品的设计目标之一是为用户提供最大的灵活性和对平板电脑行为的控制。此控件的一部分是特定于应用程序和光标/工具的设置。当然,允许用户自定义应用程序或工具的设置与需要设置设置的应用程序代码之间存在紧张关系,以便他们的应用程序按照应用程序供应商的预期工作。
绘图板应用程序通常可以分为两类:需要将绘图板坐标映射到他们请求的物理坐标空间的应用程序;和那些没有的。CAD 应用程序、数字化应用程序和模板实用程序是第一类应用程序的示例。绘画和绘图程序是第二种应用程序的示例。第二类的应用比第一类多得多。
在大多数情况下,Wacom Wintab 允许用户的自定义设置覆盖应用程序使用 Wintab API 进行的设置。但是,为了适应 CAD 和第二类中的其他应用程序,如果应用程序打开具有以下任何特征的 Wintab 上下文,Wacom Wintab 将让应用程序的 Wintab 上下文设置覆盖用户的自定义设置:
- 上下文在 lcLocks 中设置了任何位。
- 应用程序更改数位板输入原点(lcInOrgX、lcInOrgY 或 lcInOrgZ)。
- 应用程序更改数位板输入大小(范围)(lcInExtX、lcInExtY 或 lcInExtZ)。
- 应用程序更改屏幕原点(lcSysOrgX 或 lcSysOrgY)。
- 应用程序更改屏幕输出大小(范围)(lcSysOrgX 或 lcSysOrgY)。
- 应用程序将屏幕光标设置为以相对模式移动(将 lcSysMode 设置为非零)。
如何将平板电脑区域映射到应用程序像素区域?
在Wintab ScribbleDemo示例代码中可以找到有关如何将平板电脑映射到显示像素的一些示例,该代码在 WM_SIZE 消息处理程序中执行此映射。在那里,代码计算比例因子、scaleWidth 和 scaleHeight,稍后在 WM_PAINT 消息处理程序中呈现 tablet 数据时使用它们。
CMFC_DEMOView::OnCreate
{
// Get default context information
// Be sure to use default digital context for data packets before
// calling gpWTOpenA.
gpWTInfoA(WTI_DEFCONTEXT, 0, &lc);
...
gpWTOpenA(...);
...
}
CMFC_DEMOView::OnWTPacket
{
...
POINT csr;
...
// Read the packet to get tablet coordinates.
PACKET pkt;
gpWTPacket((HCTX)hCtx, wSerial, &pkt);
...
// Get window size to get pixel extents.
RECT window_rect;
GetWindowRect(&window_rect);
POINT size;
size.x = window_rect.right - window_rect.left;
size.y = window_rect.bottom - window_rect.top;
...
// Compute point in pixel space using tablet position data
csr.x = (size.x * pkt.pkX) / lc.lcInExtX;
csr.y = size.y - (size.y * pkt.pkY) / lc.lcInExtY;
...
}
我在哪里可以找到有关 Linux 平板电脑编程的信息?
访问Linux Wacom 项目或OpenSolaris Archive以获得支持。
如何对 STU-300、STU-500 或 STU-520 签名版(签名板)平板电脑进行编程?
在这里您可以获得有关Wacom 签名解决方案的信息。
我可以使用什么工具来确定平板电脑是否正在发送消息?
WinDDK 中的 hclient 工具是确定平板电脑是否正在发送笔消息的好方法。此工具不依赖于 Wintab;相反,它连接到平板电脑的 HID 描述符,并且可以监控从 HID 内核堆栈发送的平板电脑数据。只需从 hclient 已枚举的 HID 设备列表中选择设备(注意 Vendor ID = 0x56a,这是针对 Wacom 的)。确保 Usage Page = 0xD,并且 Usage = 0x1。按下对话框底部的“Blocked Read Data”按钮,当数据对话框出现时按下“Continuous Asynchronous Read”按钮。用笔触碰数位板以查看数据。
我的应用程序如何独占访问所有 Tablet 笔事件?
在我的应用程序中使用 Wintab 而不是其中一个 Microsoft Ink API 有哪些优点和缺点?
Wintab 和 Microsoft Ink API 都支持将支持墨水的 Wacom 设备数据传送到您的应用程序。但是,在选择使用哪个 API 之前,您可能需要考虑以下几点:
应用程序接口
优点
- Wacom 将 Wintab API 紧密集成到其数位板驱动程序中已有 35 年的历史。
- 它是一个非常稳定的 API。
- Wacom 数位板驱动程序组件使用 Wintab(因此我们“吃自己的狗粮”)。
- 我们认真对待我们的 Wintab ISV,并分配工程资源来分析报告的问题。
- 我们与 ISV 和开发人员合作,以尽可能从 Wintab 获得最佳用户体验。
- Wintab 不受近年来困扰 Windows 10 Ink 的任何问题的影响(请参阅Windows Ink 常见问题解答)。
- Wintab API 的理念是:“一次编写,适用于所有平板电脑”。
- Wintab API 支持所有支持 Wacom 墨水的设备(在Wintab - Overview上列出)。
- Wacom 认为支持 Wintab 的应用程序可为用户提供更好的整体墨迹书写体验。
- 支持 C、C++ 和 .NET (C#) 编程语言,以及任何可以导入 Windows DLL 的框架。
- Wintab API 支持在显示平板电脑和设备(例如 Wacom 显示平板电脑、平板电脑)以及不透明(非显示,如 Intuos)平板电脑上捕获墨迹数据。
缺点
- Wintab API 非常丰富,并且提供了一定程度的详细信息,需要花费一些时间来学习。希望这些页面上提供的信息将帮助开发人员快速升级。
- Wintab API 没有 Microsoft Ink API 提供的那种高级 API(如 InkCanvas、笔划管理、手写分析等)。
- Microsoft 不直接支持 Wintab API。因此,Wintab 并不是 Windows 基础结构中紧密编织的部分。
- Wintab API 仅在支持墨水的 Wacom 设备和那些使用 Wacom 笔传感器和驱动程序的 OEM 设备上受支持。
Microsoft Ink API
优点
- 自 Tablet PC 时代(Windows XP 时代)以来,Microsoft Ink API 一直在演变为当前的 Windows 10 变体。
- 支持使用大量墨迹对象添加墨迹(请参阅Windows Ink - 参考)。
- 以最少的努力向应用程序添加墨迹支持相对容易。
- 有大量关于使用 Microsoft Ink API 的文档和示例。
- Microsoft Ink API 很好地集成到可以使用 Visual Studio 构建的各种类型的应用程序中。
- 支持 C++ 和 .NET (C#) 编程语言。
- Microsoft Ink API 受行业内一系列支持墨水的设备支持。
- 它针对签名和笔画捕捉进行了优化。
缺点
- Microsoft 在 Windows 10 Creative 版本中引入了与墨水相关的错误(请参阅Windows Ink - 常见问题解答)。
- Microsoft Ink 没有像 Wintab 那样关注墨水质量。有时墨水行为只是“妨碍”。一个典型的例子是按住鼠标右键单击 (PHRC) 行为在点画(小墨点)操作期间干扰细粒度图形输入。由于 API 是基于笔划的,因此 PHRC 会导致需要离散墨水的操作出现问题,例如点画。
- 导航 Microsoft Ink API 命名空间以确定要使用的最佳 Ink API 有点具有挑战性(但 Windows Ink 开发文档应该对此有所帮助;概述页面位于此处:Windows Ink - Overview)。
- Microsoft Ink API 不像 Wintab API 那样提供映射板的细粒度控制以显示坐标空间。