窗体上的设置光标不会出现在控件上

时间:2017-04-07 02:08:07

标签: forms delphi grid cursor controls

我使用Delphi xe-8并且我使用线程进行查询,我希望在我的线程工作时显示沙漏光标。

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

我试图将Screen.Cursor设置为crHourGlass,但它适用于整个应用程序,所以即使我在另一个表单上停留,它也是一个沙漏。

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

1 个答案:

答案 0 :(得分:2)

当鼠标超过给定TWinControl时,操作系统会向其发送WM_SETCURSOR消息,要求其设置屏幕上的光标图标。 VCL对该消息的默认处理如下:

  1. 如果Screen.Cursor不是crDefault,那就是使用的游标。

  2. 否则,如果TWinControl鼠标下方有TGraphicControl个孩子,且其Cursor不是crDefault,那就是使用的游标。

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

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

  5. 因此,为了满足您的要求,您必须将表单的Cursor设置为所需的值,并确保表单上的所有子控件都将Cursor设置为crDefault

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