Метод IStylusPlugin::StylusUp (rtscom.h)
Уведомляет реализующий подключаемый модуль о том, что пользователь поднял ручку планшета с поверхности дигитайзера планшета.
Синтаксис
HRESULT StylusUp(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPropCountPerPkt,
[in] LONG *pPacket,
[in, out] LONG **ppInOutPkt
);
Параметры
[in] piRtsSrc
Объект Класса RealTimeStylus (RTS), отправляющий уведомление.
[in] pStylusInfo
Структура StylusInfo, содержащая сведения о RTS, связанные с пером.
[in] cPropCountPerPkt
Количество свойств на пакет. Допустимые значения: от 0 до 32 включительно.
[in] pPacket
Начало данных пакета.
[in, out] ppInOutPkt
Указатель на измененный пакет данных пера. Подключаемый модуль может использовать этот параметр для передачи измененных данных пакетов в подчиненные пакеты. Значение, отличное от NULL , указывает на то, что пакет был изменен, и RTS будет отправлять эти данные в подключаемые модули с помощью параметра pPacket .
Возвращаемое значение
Описание возвращаемых значений см. в разделе Классы и интерфейсы RealTimeStylus.
Комментарии
Этот метод используется, когда перо покидает поверхность дигитайзера.
В буфере можно вернуть массив измененных пакетов ppInOutPkt. Пакеты, используемые методами IStylusPlugin::StylusUp и IStylusPlugin::StylusDown, можно только изменять. Их нельзя удалить. Пакеты, используемые методами IStylusPlugin::P ackets и методом IStylusPlugin::InAirPackets , можно удалить.
Если вы изменяете пакеты, cPropCountPerPkt, то есть количество LONG в ppInOutPkt, должно быть разделено на текущие требуемые свойства пакета (DPP), доступные на текущем устройстве ввода.
Вы можете изменить пакеты, обновив параметры cPropCountPerPkt и ppInOutPkts . Измените cPropCountPerPkt на допустимое общее число свойств пакетов, а ppInOutPkts — на допустимый буфер данных, который учитывает значения для каждого DPP в каждом пакете. В этом расположении может присутствовать только один пакет для метода IStylusPlugin::StylusUp и метода IStylusPlugin::StylusDown.
Например, если добавить три пакета, а DPP в настоящее время используется X, Y и Pressure, необходимо иметь в этом буфере девять значений LONG и задать для параметра cPropCountPerPkt значение 9.
Значение cPropCountPerPkt полезно для уточнения границ между пакетами в плоском массиве целых чисел, входящего для таких событий, как событие NewPackets . Пакеты можно упаковывать, чтобы обеспечить более эффективную передачу данных, поэтому не требуется, чтобы подключаемый модуль вызывался один раз для каждого пакета.
Примеры
В следующем примере кода C++ реализуется метод StylusUp , который вызывает вспомогающую функцию ModifyPacket, чтобы изменить значение данных X,Y, чтобы они попали в указанный прямоугольник. Это те же функции, которые реализованы в примере C# ( Пример подключаемого модуля RealTimeStylus). Второй фрагмент кода — это функция ModifyPacket .
STDMETHODIMP CPacketModifier::StylusUp(
/* [in] */ IRealTimeStylus *piRtsSrc,
/* [in] */ const StylusInfo *pStylusInfo,
/* [in] */ ULONG cPropCountPerPkt,
/* [size_is][in] */ LONG *pPacket,
/* [out][in] */ LONG **ppInOutPkt)
{
return ModifyPacket(cPropCountPerPkt, pPacket, ppInOutPkt);
}
// Helper method to modify a single packet
// Called from StylusDown() and StylusUp()
HRESULT CPacketModifier::ModifyPacket(
/* [in] */ ULONG cPropCountPerPkt,
/* [size_is][in] */ LONG *pPacket,
/* [out][in] */ LONG **ppInOutPkt)
{
// Pointer to a buffer to hold changed packet values
LONG* pTempOutPkt = NULL;
// X and Y come first (0 and 1),
// other properties follow
ULONG iOtherProps = 2;
if (cPropCountPerPkt > 0)
{
pTempOutPkt = (LONG*)CoTaskMemAlloc(sizeof(LONG)*cPropCountPerPkt);
if (NULL != pTempOutPkt)
{
// Packet data always has x followed by y followed by the rest.
LONG x = pPacket[0];
LONG y = pPacket[1];
// In the packet data, check whether
// its X,Y values fall outside of the specified rectangle.
// If so, replace them with the nearest point that still
// falls within the rectangle.
x = (x < m_filterRect.left ? m_filterRect.left : x);
x = (x > m_filterRect.right ? m_filterRect.right : x);
y = (y < m_filterRect.top ? m_filterRect.top : y);
y = (y > m_filterRect.bottom ? m_filterRect.bottom : y);
// If necessary, modify the x,y packet data
if ((x != pPacket[0]) || (y != pPacket[1]))
{
pTempOutPkt[0] = x;
pTempOutPkt[1] = y;
// Copy the properties that we haven't modified
while (iOtherProps < cPropCountPerPkt)
{
pTempOutPkt[iOtherProps] = pPacket[iOtherProps++];
}
*ppInOutPkt = pTempOutPkt;
}
else
{
CoTaskMemFree(pTempOutPkt);
}
}
}
return S_OK;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP Tablet PC Edition [только классические приложения] |
Минимальная версия сервера | Ни одна версия не поддерживается |
Целевая платформа | Windows |
Header | rtscom.h |
DLL | RTSCom.dll |