Поделиться через


Метод IStylusPlugin::StylusDown (rtscom.h)

Уведомляет реализующий подключаемый модуль о том, что ручка планшета коснулась поверхности дигитайзера.

Синтаксис

HRESULT StylusDown(
  [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 Event . Пакеты можно упаковывать в пакет, чтобы обеспечить более эффективную передачу данных, поэтому не требуется один раз вызывать подключаемый модуль для каждого пакета.

Примеры

В следующем примере кода C++ реализуется метод StylusDown , который вызывает вспомогающую функцию ModifyPacket для изменения значения данных X,Y, чтобы они попали в указанный прямоугольник. Это те же функции, которые реализованы в примере C# ( Пример подключаемого модуля RealTimeStylus). Второй фрагмент кода — это функция ModifyPacket .

STDMETHODIMP CPacketModifier::StylusDown( 
            /* [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

См. также раздел

IStylusAsyncPlugin

Интерфейс IStylusPlugin

IStylusSyncPlugin

Справочник по RealTimeStylus