2016-08-11 2 views
3

Windows 8.1 타블렛에서 실행되는 VCL 응용 프로그램에 대해 TCustomControl 파생 클래스를 만들었습니다.Delphi VCL with Windows Tablet

나는 분명히 터치 기반 임에도 불구하고 OnMouseDown/OnMouseUp 이벤트를 사용하고 있습니다.

내가 원하는 것은 길게 누르기를 감지하는 것입니다. 즉 1 초 동안 길게 터치합니다. 따라서 OnMouseDown 이벤트에서 다운 타임 스탬프를 기록하고, 마우스가 다운되었음을 나타내는 플래그를 설정하고 1 초 동안 휴면 상태 인 익명 스레드를 만든 다음 플래그를 확인합니다.

OnMouseUp에서 플래그를 false로 설정했습니다.

손가락을 컨트롤 위에서 움직이면 작동합니다. 그렇지 않으면 손가락을 뗄 때까지 마우스를 길게 터치하면 이벤트가 호출되지 않습니다.

제스처를 보았지만 완전히 과장되어 보였습니다. 그리고 내가 이해하는 것은 긴 언론을 지원하지 않습니다.

의견을 보내 주셔서 감사합니다. 리처드

+0

MouseDown이 발생하면 1000ms 간격으로 타이머를 활성화하고 MouseUp에서 타이머를 취소하는 것이 어떻습니까? OnTimer 이벤트에 코드를 삽입하십시오. 마우스를 1 초 이상 누르고 있으면 발사해야합니다. 당신은 아마 당신이 그것을 시작한 컨트롤을 저장하는 한 전체 양식에 대해 하나의 타이머를 없앨 수 있습니다. OnTimer 이벤트에서 타이머를 즉시 비활성화하는 것을 잊지 마십시오. – penarthur66

+0

감사하지만, 익명의 스레드와 같은 이유로 작동하지 않습니다. 마우스를 움직이거나 손가락을 움직이지 않으면 MouseDown이 작동하지 않습니다. –

+0

나는 윈도우 태블릿이 없다.하지만 난 그냥 TButton과 TMemo를 새로운 VCL 폼 (베를린)에 추가하고 MouseDown 및 MouseUp 이벤트 핸들러의 메모에 라인을 추가하는 코드를 추가했다. 마우스 클릭과 동기화됩니다. 태블릿이 표준 PC 마우스의 이벤트를 발생시키는 방식에는 차이가 있어야합니다. – penarthur66

답변

0

MouseDown 이벤트가 트리거 당신은 당신이 기본적으로 망했다 거기에 당신의 지연 카운터 의존 만들고 싶어되지 않습니다. 즉, 나는 당신이 약간의 개념 변화에 개방되어 있다고 가정한다. :)

플립형 스위치로 단추를 바꾸면 여전히 가능하다고 생각합니다. 사용자는 드래그하여 StartDrag 이벤트를 트리거해야하는 "잡아 당겨"(터치) 끌어 와서 원하는 시간 동안 그 위치에 놓아야합니다. 스위치 (MouseDown 이벤트)가 해제되면 다시 스냅 다운됩니다.

그런 버튼을 디자인하려면 손잡이에 작은 TPanel을 사용하고 약간의 수직 이동을 허용하기 위해 약간 큰 TPanel을 사용할 수 있습니다. BevelInner 속성을 bvLowered로 설정하고 BevelOuter를 bvRaised로 설정하여 프레임 및 손잡이 패널의 자식으로 보이게 만듭니다. 또는 TImage를 사용하여 노브를 위/아래 위치에 표시하십시오. 어쨌든 손잡이 요소의 DragKind 속성을 dkDrag로 설정하면 StartDrag 이벤트가 발생하지 않습니다. 그래도 이벤트가 시작되지 않으면 detect touch input capabilities으로 가서 조사 결과를보고하십시오.

확실하지는 않지만 어쩌면 그만한 가치가 있습니다.

1

당신이 직면 한 것은 터치 입력 장치가있는 Windows의 "정상적인"그러나 어리석게도 어리석은 행동입니다. 우리는 잠시 동안 똑같은 문제에 직면 해 있으며, 지난 몇 주 동안 그것을 적극적으로 해결하려고 노력하고 있습니다. 트릭은 윈도우가 터치 입력 장치를 "마우스"로 처리하여 한 손가락으로 완전히 제어 할 수 있다는 것입니다. 따라서 다음과 같은 몇 가지 상태가 있습니다.

이벤트는 다음과 같습니다. 시작 (아래로), 이동, 위로, 오른쪽 클릭으로 콜백을 등록하려면 고정 된 상태로 이동하십시오. 마지막 보고서지만 여전히 아래로).

한편, 더 많은 주들이 있습니다. 먼저, 손가락을 아래로 누르면 내부적으로 "터치 다운"이 감지됩니다. 행사. 일정 시간 동안 기다릴 때보 다 (해킹을 변경하거나 드라이버에 따라 다를 수 있음), 마우스 오른쪽 버튼을 클릭했는지 확인하려면 (x 시간, 릴리스시) ! Y 시간 전에!오른쪽 클릭 이벤트) 또는 (터치 이벤트 트리거 - y 시간)이 x- 시간보다 길고 y가 만료되면 왼쪽 아래로 이벤트가 발생합니다. (클릭하지 마십시오!)).
한편 첫 번째 터치 다운이 이동 또는 - 중 하나로 중단되면 x 시간이 만료 될 때까지 기다리는 중! X 시간 전에 손가락의 릴리스는 자동 (릴리스)에(이동) 또는 마우스 왼쪽 버튼을 클릭을 왼쪽 를 트리거, 만기가된다. Y 시간이 만료되거나 MOVE가 트리거 된 후에도 같은 시간이 소요됩니다.

더 간단히 말하면 및 이해, 내가 예를 제공하려고합니다 : 포인트 B 0 초 위치, 시작 :

이의 당신은 터치 장치가, 다음과 같이 타이밍이 있다고 가정 해 봅시다 우리의 타임 라인. 포인트 X는 타임 라인의 5 초 위치에있는 첫 번째 트리거 중단 점입니다. 포인트 Y는 두 번째 트리거 중단 점으로, 타임 라인의 10 초에 위치합니다.

손가락을 만지면 타임 라인이 시작됩니다. 가능한 시나리오 : - 포인트 X가 나오기 전에 언제든지 놓기 -> 왼쪽 클릭이 트리거 됨 (바로 아래로 차례대로 이벤트를 차례대로 터치) - 포인트 X 이후이지만 포인트 Y보다 먼저 릴리스 -> 마우스 오른쪽 버튼 클릭 트리거 됨 (터치 다운 및 업 이벤트, 오른쪽 클릭 플래그 포함) - 지점 Y에 도달 - 왼쪽 아래로 트리거 됨! - 릴리스 사이에 트리거가 이동했는지 여부와 관계없이 언제든지 지점 Y 이후에 해제합니다 (타임 라인에서이 지점에 도달하기 전에 이동이 트리거되지 않음) -> 왼쪽 위로 트리거됩니다.

  • 당신의 트리거 (DO) 이동 이벤트 이전에 도달 지점 X -> 그것을 감지하는 당신이 그것을 해제 할 때까지, 많은 이동 이벤트 다음, 트리거 아래 왼쪽 -> 다음
  • 트리거 달려 당신 X 후에 Y 이벤트를 트리거 (do)하기 전에 -> 위와 같습니다!
  • Y 지점에 도달하여 이후에 이동 -> 위의 체크 포인트 no4.

희망이 있습니다.

이제 가능한 해결책으로 이동하십시오 : 맞춤형 드라이버가 하나의 옵션이 될 수 있지만 아직 없습니다. 따라서 다른 옵션을 시도하고 있습니다. 현재 가장 유망한 것은 RAW_INPUT 및 Touch 후크를 사용하는 것 같습니다. 우리가 원하는 것을 얻기 위해 그들을 결합해야 할 것 같습니다. 밝은면은 감지하고 결정한 다음 응용 프로그램으로 전달하려는 타이밍과 이벤트에 관계없이 손가락이 장치에 닿으면 창 자체가 감지한다는 것입니다. 그러나 어떤 이유로 그와 같은 용도로 사용하기가 어려웠습니다. 화면을 터치 한 순간 손가락 아래에 나타나는 투명한 점을 간단히 확인할 수 있습니다.

한편, 안드로이드는 더 나은 방법 ...

는 희망이 도움이, 나는 우리가 통해 와서 사용에 대한 충분한 좋은 일을 일단 완벽한 솔루션으로 돌아올 행복 해요 이런 일을 처리합니다.

M.*

관련 문제