我使用Delphi xe-8并且我使用线程进行查询,我希望在我的线程工作时显示沙漏光标。
我将光标设置为沙漏但是当我将鼠标悬停在窗体上的控件上时,例如在网格上,光标显示为默认值;当我将鼠标悬停在表单本身上时,光标只会发生变化。我想要做的是在窗体和窗体上的任何控件上显示沙漏光标,而不是应用程序的其余部分。
我试图将Screen.Cursor设置为crHourGlass,但它适用于整个应用程序,所以即使我在另一个表单上停留,它也是一个沙漏。
有可能吗?如果是我怎么能这样做?
答案 0 :(得分:2)
当鼠标超过给定TWinControl
时,操作系统会向其发送WM_SETCURSOR
消息,要求其设置屏幕上的光标图标。 VCL对该消息的默认处理如下:
如果Screen.Cursor
不是crDefault
,那就是使用的游标。
否则,如果TWinControl
鼠标下方有TGraphicControl
个孩子,且其Cursor
不是crDefault
,那就是使用的游标。
否则,如果TWinControl
自己的Cursor
不是crDefault
,那就是使用的游标。
否则,消息将传递到父窗口。重复步骤2-3。
因此,为了满足您的要求,您必须将表单的Cursor
设置为所需的值,并确保表单上的所有子控件都将Cursor
设置为crDefault
。
如果这不适合您,那么您可以尝试的替代方法是在工作线程运行时使用SetWindowsHookEx()
在Form的拥有线程中安装本地WH_CALLWNDPROC
挂钩。如果挂钩检测到针对所需表单的WM_SETCURSOR
或其某个子控件的HWND
消息,并且Screen.Cursor
为crDefault
,则调用Win32 API SetCursor()
函数用于设置所需的光标图标。