델파이와 C++빌더는 2010 버전부터 멀티터치와 제스추어를 지원하고 있습니다. 경쟁 개발툴인 비주얼스튜디오에서 터치 개발을 하는 것보다 훨씬 간단하면서도 강력하기 때문에 멀티터치 애플리케이션을 개발하는 데 있어 델파이와 C++빌더에게 적수는 없죠.
그런데 의외로, 현재 PC(혹은 디바이스)에서 멀티터치가 지원되는지 여부를 알아낼 방법은 지원하지 않더군요. 멀티터치가 지원되는 장비인지를 인식해서 특별한 부가 기능을 제공한다면 엔드유저로부터 더 좋은 평을 받을 수 있을것입니다.
기본 키보드+마우스 환경 외에 멀티터치에 특화된 기능을 추가로 지원하려고 할 경우, 멀티터치가 지원되지 않는 장비일 경우 그 사실을 인식할 수 있어야 하겠지요. 또한 애플리케이션의 실행에 터치 기능이 사실상 필수적인 경우라면 터치스크린이 없는 장비에서는 “죄송!” 하는 메시지 정도는 뿌려줘야 할 테구요.
윈도우7 이상 버전의 시스템 정보를 보면 아래와 같이 현재 장비에서 터치가 가능한지 여부를 확인할 수 있는데요.
이제, 이 멀티터치 관련 정보를 델파이 혹은 C++빌더에서 코드로 알아내는 방법을 살펴봅시다.
Windows API의 GetSystemMetrics() 함수는 시스템 하드웨어에 대한 정보를 알아내기 위해 많이 활용되는 함수인데, 인자로 넘기는 값에 따라 서로 다른 여러가지 정보들을 알아낼 수 있죠. 이 함수에 새로 추가된 값으로 SM_DIGITIZER와 SM_MAXIMUMTOUCHES가 있습니다. 인자로 SM_DIGITIZER를 넘기면 펜 및 디지타이저에 대한 정보를 알아낼 수 있고, 인자로 SM_MAXIMUMTOUCHES를 넘기면 동시 인식 가능한 최대 터치 포인트의 갯수를 알아낼 수 있습니다. SM_DIGITIZER 및 SM_MAXIMUMTOUCHES 값들은 새로 추가되어 윈도우의 예전 버전에서는 지원되지 않지만, 지원되지 않는 경우에도 GetSystemMetrics의 기본 동작에의해 제대로 동작합니다(0을 리턴).
아래는 델파이 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
procedure TForm1.Button1Click(Sender: TObject); var iDigitizerStat: byte; iTouchPointCnt: Integer; begin iDigitizerStat := GetSystemMetrics(SM_DIGITIZER); if iDigitizerStat and (NID_READY or NID_MULTI_INPUT) = 0 then Memo1.Lines.Add('이 디스플레이에 사용할 수 있는 펜 및 터치식 입력이 없습니다.') else begin iTouchPointCnt := GetSystemMetrics(SM_MAXIMUMTOUCHES); Memo1.Lines.Add(Format('%d 개의 터치포인트를 사용할 수 있는 터치식 입력', [iTouchPointCnt])); end; end; |
아래는 C++빌더 코드입니다.
1 2 3 4 5 6 7 8 9 10 11 |
void __fastcall TForm1::Button1Click(TObject *Sender) { unsigned char iDigitizerStat = GetSystemMetrics(SM_DIGITIZER); if((iDigitizerStat & (NID_READY | NID_MULTI_INPUT)) == 0) Memo1->Lines->Add("이 디스플레이에 사용할 수 있는 펜 및 터치식 입력이 없습니다."); else { int iTouchPointCnt = GetSystemMetrics(SM_MAXIMUMTOUCHES); Memo1->Lines->Add(String().sprintf(L"%d개의 터치포인트를 사용할 수 있는 터치식 입력", iTouchPointCnt)); } } |
한가지 더. 최근 들어 멀티터치 지원이 확산되고는 있지만, 큰 화면을 선호하는 개발자들의 특성상 개발 장비에서 멀티터치 모니터를 사용하시는 분들은 상대적으로 소수일 것입니다. 저도 개발을 위해 올해 초에 구입한 씽크패드 태블릿2 윈도우8 태블릿이 있지만, 개발 과정에서 사사건건 태블릿으로 실행파일을 복사하여 테스트하기는 너무 불편합니다.
그래서 이렇게 터치스크린이 없는 환경에서 멀티터치 개발 테스트를 해보기 위해서는, 하드웨어에서 멀티터치 지원이 되지 않는 상태에서 에뮬레이션하는 방식이 더 유리할 수 있겠습니다. 그것을 가능하게 해주는 것이 Multitouch Vista입니다. Multitouch Vista를 설치하면 마우스를 2개로 멀티터치 스크린을 에뮬레이션할 수 있습니다.
멀티터치 비스타를 설치하는 과정은 그렇게 간단하지만은 않은데, 이미 글로 써주신 분들이 많으니 그중 하나를 링크합니다.
http://liverex.tistory.com/308
제가 운영하는 볼랜드포럼의 총무이신 남병철님이 C++Builder Developer’s Journal에 기고하신 기사에서도 멀티터치 비스타 설치에 대해 설명하고 있습니다. (다만 영문 잡지에 기고한 거라서 영어로… ㅎㅎ)
http://bcbjournal.org/special_issue/bcbj_vol14_num5.pdf
멀티터치 비스타가 설치되면, 윈도우의 시스템 정보뿐만 아니라 당연히 위의 멀티터치 테스트 코드에서도 멀티터치가 인식되며, 역시 255개의 터치 포인트가 잡힙니다.