Ручка ввода в Windows с использованием C++
Как я могу получить доступ к вводу пером с давлением на Windows? Я делаю программу рисования и использую wintab, но wintab не существует на моем новом компьютере. Wintab кажется устаревшим, но, очевидно, есть некоторые более новые API, называемые Windows Ink и Tablet PC.
Проблема в том, что я не могу найти документацию или пример того, как на самом деле использовать недавний API-интерфейс для пера. API должен использоваться в обычном неуправляемом настольном приложении C++. Кроме того, я действительно предпочел бы избегать UWP, если это возможно, потому что я не хочу иметь дело с "развертыванием" или "подписанием".
Где я могу скачать SDK с заголовками C/C++ и библиотеками, которые дадут мне возможность ввода пером?
1 ответ
Я получил лучшие результаты, используя API Realtimestylus вместо wintab. Потому что wintab, похоже, не возвращает пакеты достаточно часто для плавных линий при рисовании.
Windows RTS API предоставил мне больше информационных пакетов, что позволило получить более плавные результаты при рисовании, а также можно было получить доступ к дополнительной информации пера, такой как наклон и нажатие кнопок пера.
есть приятное небольшое демонстрационное приложение, использующее RealTimeStylus с SDL: https://backworlds.com/under-pressure/ Оно включает комментарии к реализации, где объясняется, как получить доступ к исходному вводу с планшета.
Пример кода содержит класс обработчика событий, производный от класса интерфейса IStylusSyncPlugin из rtscom.h. С помощью этого интерфейса вы можете регистрировать события пера и касания с помощью STDMETHODS, например: STDMETHOD(StylusButtonDown){}.
Получить фактическое положение пера в координатах экрана немного сложно. Поскольку вам сначала нужно получить координаты x,y в виде пакетов, используя STDMETHOD(пакеты). Вам также необходимо будет описать, какие пакеты вы хотите получать и в каком порядке, используя IRealTimeStylus::GetPacketDescriptionData().
Наконец, вам нужно преобразовать ввод X, Y в экранные координаты в зависимости от dpi, используя Gdiplus::Graphics::GetDpiX()
X = dpiX * (с плавающей точкой)pLastPacket[g_lContexts[iCtx].x] / 2540;
Y = dpiY * (float)pLastPacket[g_lContexts[iCtx].y] / 2540;
Все это представлено в примере кода Андерса Экермо.
Надеюсь, это поможет.
Посмотрите на RealTimeStylus и API MS Pointer (сообщения WM_PointerXxx). Это два разных способа.