다음을 통해 공유


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

알림을 보낸 RTS( RealTimeStylus Class ) 개체입니다.

[in] pStylusInfo

펜과 연결된 RTS에 대한 정보를 포함하는 StylusInfo 구조 체입니다.

[in] cPropCountPerPkt

패킷당 속성 수입니다. 유효한 값은 0에서 32까지입니다( 포함).

[in] pPacket

패킷 데이터의 시작입니다.

[in, out] ppInOutPkt

수정된 스타일러스 데이터 패킷에 대한 포인터입니다. 플러그 인은 이 매개 변수를 사용하여 수정된 패킷 데이터를 다운스트림 패킷에 공급할 수 있습니다. NULL 이외의 값은 패킷이 수정되었음을 나타내고 RTS는 pPacket 매개 변수를 사용하여 이 데이터를 플러그 인으로 보냅니다.

반환 값

반환 값에 대한 설명은 RealTimeStylus 클래스 및 인터페이스를 참조하세요.

설명

이 메서드는 펜이 디지타이저 표면을 떠날 때 사용됩니다.

버퍼 ppInOutPkt에서 수정된 패킷 배열을 반환할 수 있습니다. IStylusPlugin::StylusUp 메서드IStylusPlugin::StylusDown 메서드에서 사용하는 패킷은 수정할 수 있습니다. 삭제할 수 없습니다. IStylusPlugin::P ackets 메서드IStylusPlugin::InAirPackets 메서드 메서드에서 사용하는 패킷을 삭제할 수 있습니다.

패킷을 수정하는 경우 ppInOutPkt의 LONG 수인 cPropCountPerPkt는 현재 입력 디바이스에서 사용할 수 있는 현재 원하는 DPP(패킷 속성)로 나눌 수 있어야 합니다.

cPropCountPerPktppInOutPkts 매개 변수를 업데이트하여 패킷을 수정합니다. cPropCountPerPkt를 유효한 총 패킷 속성 수로 변경하고 ppInOutPkts를 모든 패킷의 각 DPP 값을 계산하는 유효한 데이터 버퍼로 변경합니다. IStylusPlugin::StylusUp 메서드 및 IStylusPlugin::StylusDown 메서드의 해당 위치에는 하나의 패킷만 있을 수 있습니다.

예를 들어 3개의 패킷을 추가하고 DPP가 현재 X,Y 및 압력인 경우 이 버퍼에 9개의 LONG 값이 있어야 하며 cPropCountPerPkt 를 9로 설정해야 합니다.

cPropCountPerPkt 값은 NewPackets 이벤트 이벤트와 같은 이벤트에 대해 들어오는 정수의 플랫 배열에 있는 패킷 간의 경계를 명확히 하는 데 유용합니다. 패킷당 플러그를 한 번 호출할 필요가 없도록 데이터 전송의 효율성을 높일 수 있도록 패킷을 번들로 묶을 수 있습니다.

예제

다음 C++ 코드 예제에서는 도우미 함수 ModifyPacket을 호출하는 StylusUp 메서드를 구현하여 지정된 사각형에 속하도록 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 태블릿 PC 버전 [데스크톱 앱만 해당]
지원되는 최소 서버 지원되는 버전 없음
대상 플랫폼 Windows
헤더 rtscom.h
DLL RTSCom.dll

추가 정보

IStylusAsyncPlugin

IStylusPlugin 인터페이스

IStylusSyncPlugin

RealTimeStylus 클래스