2017-04-07 78 views
1

我使用Delphi xe-8,我使用线程进行查询,我想在我的线程正在工作时显示沙漏光标。在窗体上设置光标不会显示在控件上

我将光标设置为沙漏,但是当我将鼠标悬停在窗体上的控件上时(例如在网格上),光标显示为默认值;当我将鼠标悬停在表单本身上时,光标只会改变。我想要做的是在窗体上显示沙漏形光标,并在窗体上显示任何控件,但不是应用程序的其余部分。

我试图将Screen.Cursor设置为crHourGlass,但它是用于整个应用程序,所以即使我将鼠标悬停在另一个窗体上,它也是沙漏。

有没有可能这样做?如果是我该怎么做?

+2

线程没有游标。如果您希望每个控件具有相同的光标,则需要为每个控件设置它。如果你这样做,确保你包括一个try..finally,以确保他们都得到回退。 –

+0

你需要设置['Screen.Cursor'](http://docwiki.embarcadero.com/Libraries/Berlin/en/Vcl.Forms.TScreen.Cursor) –

+1

@FreeConsulting:不,你不知道,海报说他们已经尝试过了。 –

回答

2

当鼠标悬停在给定的TWinControl上时,操作系统会发送一个WM_SETCURSOR消息,请求它设置屏幕上的光标图标。该VCL的该消息的默认处理是这样的:

  1. 如果Screen.CursorcrDefault,所使用的光标。

  2. 否则,如果TWinControlTGraphicControl孩子鼠标下方,其CursorcrDefault,所使用的光标。

  3. 否则,如果TWinControl自己的Cursor不是crDefault,那就是使用的游标。

  4. 否则,消息被传递给父窗口。重复步骤2-3。

所以,为了你问什么,你就必须设置窗体的Cursor所需的值,并确保窗体上的所有子控件有其Cursor设置为crDefault

如果这不是您的选择,那么您可以尝试的另一种方法是使用SetWindowsHookEx()在工作线程运行时在窗体的拥有线程中安装本地WH_CALLWNDPROC挂钩。如果钩子检测到WM_SETCURSOR消息针对所需表单或其子控件之一的HWND,并且Screen.CursorcrDefault,则调用Win32 API SetCursor()函数来设置所需的光标图标。