2017-04-07 113 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()函數來設置所需的光標圖標。