XP타블렛 에디션, Vista, 7 등에서 터치 스크린이나 타블렛 등을 이용하면 해당 장치들은 마우스와 별도로 처리해주는 과정을 거쳐주면 좀더 깔끔한 프로그램을 만들수 있습니다.
단순히 깔끔한 처리를 넘어서 터치와 펜입력은 마우스와는 이벤트 발생 시점이 조금 틀리므로 이런 차이점을 고려해서 프로그램을 만들어줘야합니다.
대표적으로 차이가 나는 부분이 Down/Up 이벤트로 마우스는 버튼을 누르면 Down 이벤트가 발생하고, 버튼을 놓으면 Up이벤트가 발생합니다. 하지만 터치와 펜 입력은 버튼을 놓는 시점에 Down/Up 이벤트가 동시에 발생합니다.
(혹은 Down 후 Move시에 Down 이벤트 발생)
이런 차이점은 단순한 처리의 경우에는 별다른 문제점이 없습니다. 예를 들어서 버튼의 경우 터치/펜 이벤트도 어차피 Up 이벤트가 발생하는 순간에 Down 이벤트도 발생하므로 버튼이 눌렸다는 이벤트는 발생하므로 마우스와 마찬가지로 버튼의 눌린 것에 대한 이벤트 처리가 가능합니다.
그러나 다음의 경우에 대해서는 문제가 발생합니다.
직접 버튼 컨트롤을 만들고 버튼의 이미지를 Normal, Hover, Press 상태에 따라서 별도로 만들고 마우스/터치/펜 이벤트를 그냥 일반 마우스 이벤트로 처리한다면 마우스는 3가지 상태에 대해서 모두 정상 동작합니다.
하지만 터치/펜의 경우는 정상 동작을 하지 않습니다. 앞서 말했듯이 터치/펜은 Up이벤트가 발생해야 Down이벤트가 발생합니다. 즉 터치/펜을 이용해서 버튼을 누른채로 가만히 있다면 원래는 Press 이미지가 그려져야 하는데 터치/펜은 그 시점에 Down 이벤트가 발생하지 않으므로 Press 이미지를 그리지 못합니다.
(이런 문제점은 Vista, 7 등에서 기본 버튼 컨트롤 위에서도 발생합니다.)
MS에서는 이런 문제를 해결할 수 있도록 터치/펜에 대한 패킷데이터를 바로 받을 수 있는 방법을 제공하는데 Microsoft.Ink.Dll에 들어있는 RealTimeStylus가 그것입니다.
RealTimeStylus는 XP Tablet Edition을 위한 TabletSDK에 처음 들어있었고, 비스타(닷넷프레임워크 3.0)에서부터는 기본적으로 들어있습니다. 이것을 사용하면 패킷데이터를 바로 받을 수 있기 때문에 최종 결과물을 보면 일반 마우스처럼 동작하도록 만들 수 있고 단순히 위의 내용에 대한 해결방법외에 타블렛, 터치에 대한 다양한 정보를 얻을 수 있습니다.
참고로 Microsoft.Ink.Dll은 몇가지 버전이 있는데 단순히 위에 열거한 문제를 해결하기 위해서는 TabletSDK에 들어있는1.7버전을 사용해도 됩니다. 하지만 샘플에서는 마우스/터치/타블렛을 지원하는 코드를 포함하느라 비스타에 들어있는 6.0버전을 사용했습니다.
(참고로 7에 들어있는 6.1 버전은 멀티터치 관련한 내용도 들어있습니다.)
아래 링크는 TabletSDK와 Microsoft.Ink.Dll 버전 선택에 관한 MSDN 문서입니다.
RealTimeStylus의 간단한 샘플에 대한 코드는 다음 포스트에서 다루겠습니다.