2017-04-07 9 views
1

저는 델파이 xe-8을 사용하며 쿼리 용 스레드를 사용하고 스레드가 작동하는 동안 모래 시계 커서를 표시하려고합니다.폼에 setted 커서가 나타나지 않습니다.

커서를 모래 시계로 설정했지만 양식의 컨트롤 (예 : 그리드 위에 마우스를 올려 놓을 때 커서가 기본값으로 표시됩니다. 커서는 양식 자체 위에 마우스를 올리면 변경됩니다. 내가 원하는 것은 양식과 양식의 모든 컨트롤 위에 모래 시계 커서를 표시하는 것이지만 나머지 응용 프로그램은 표시하지 않는 것입니다.

저는 Screen.Cursor를 crHourGlass로 설정하려고했지만 다른 응용 프로그램을위한 것이기 때문에 다른 폼을 가리키더라도 모래 시계입니다.

그렇게 할 수 있습니까? 내가 그걸 어떻게 할 수 있니?

+2

스레드에는 커서가 없습니다. 각 컨트롤에 동일한 커서를 두려면 각 컨트롤에 대해 설정해야합니다. 그렇게 할 경우 try..finally를 포함시켜 모두 다시 설정되도록하십시오. –

+0

['Screen.Cursor']을 설정해야합니다. (http://docwiki.embarcadero.com/Libraries/Berlin/en/Vcl.Forms.TScreen.Cursor) –

+1

@FreeConsulting : 아니요, 그렇지 않습니다. 포스터는 이미 그것을 시도했다고 말했다. –

답변

2

마우스가 주어진 TWinControl 이상이면 OS는 화면상의 커서 아이콘을 설정하라는 메시지를 WM_SETCURSOR 메시지로 보냅니다. 해당 메시지의 VCL의 기본 처리는 다음과 같이 진행하십시오 Screen.Cursor하지 crDefault 경우, 즉 사용되는 커서가

  1. . TWinControl 마우스 아래에 TGraphicControl 아이가, 그 Cursor하지 crDefault 경우

  2. 그렇지 않으면, 그 사용되는 커서입니다.

  3. TWinControl 자신의 Cursor이 아닌 경우 해당 커서가 사용됩니다.

  4. 그렇지 않으면 메시지가 상위 창으로 전달됩니다. 2-3 단계를 반복하십시오.

그래서, 당신이 요구하는 일을하기 위해, 당신은 양식의 Cursor에 원하는 값을 설정해야하고, 양식의 모든 자식 컨트롤이 crDefault 자신의 Cursor 설정되어 있는지 확인합니다.

이 옵션을 사용할 수 없다면 SetWindowsHookEx()을 사용하여 작업자 스레드가 실행되는 동안 양식 소유 스레드에 로컬 WH_CALLWNDPROC 후크를 설치하십시오. 후크가 원하는 폼 또는 해당 자식 컨트롤 중 하나 인 HWND을 대상으로하는 WM_SETCURSOR 메시지를 감지하고 Screen.CursorcrDefault 인 경우 Win32 API SetCursor() 함수를 호출하여 원하는 커서 아이콘을 설정합니다.