【问题标题】:Pen input in Windows using C++使用 C++ 在 Windows 中进行笔输入
【发布时间】:2017-03-12 04:16:40
【问题描述】:

如何在 Windows 上通过压力访问笔输入?我正在制作一个绘图程序,并且一直在使用 wintab,但是我的新计算机上不存在 wintab。 Wintab 似乎已被弃用,但显然有一些较新的 API,称为 Windows Ink 和 Tablet PC。

问题是我找不到有关如何实际使用最近的笔 API 的文档或示例。 API 需要可用于普通的非托管 C++ 桌面应用程序。另外,如果可能的话,我真的宁愿避免使用 UWP,因为我不想处理“部署”或“签名”。

我可以在哪里下载具有 C/C++ 标头和库的 SDK,可以为我提供原始笔输入?

【问题讨论】:

    标签: c++ api tablet pen pressure


    【解决方案1】:

    我使用 Realtimestylus API 而不是 wintab 获得了更好的结果。因为在绘制时,wintab 似乎没有足够频繁地返回数据包以实现平滑线。

    windows RTS API 给了我更多的信息包,因此绘图时的结果更流畅,并且可以访问更多的笔信息,例如倾斜和笔按钮按下。

    有一个使用 RealTimeStylus 和 SDL 的不错的小型演示应用程序: https://backworlds.com/under-pressure/ 它在实现中包含 cmets,其中解释了如何访问原始平板电脑输入。

    示例代码包含从 rtscom.h 中的接口类 IStylusSyncPlugin 派生的事件处理程序类。 通过此界面,您可以使用 STDMETHODS 注册笔和触摸事件,例如:STDMETHOD(StylusButtonDown){}。

    要获得屏幕坐标中的实际笔位置有点困难。因为您首先需要使用 STDMETHOD(Packets) 将 x,y 坐标作为数据包获取。您还需要描述要接收的数据包以及使用的顺序:IRealTimeStylus::GetPacketDescriptionData()。

    最后,您需要根据 dpi 将 X、Y 输入转换为屏幕坐标, 使用 Gdiplus::Graphics::GetDpiX()

    X = dpiX * (float)pLastPacket[g_lContexts[iCtx].x] / 2540;

    Y = dpiY * (float)pLastPacket[g_lContexts[iCtx].y] / 2540;

    所有这些都由 Anders Ekermo 在示例代码中提供。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      查看 RealTimeStylus 和 MS Pointer API(WM_PointerXxx 消息)。这是两种不同的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-03-09
        相关资源
        最近更新 更多