2014-09-24 13 views
5

Potrzebuję użyć niestandardowego kursora w moim projekcie pulpitu Firemonkey. Mogę użyć LoadCursorFromFile w projekcie VCL, aby załadować niestandardowy kursor do mojego projektu. Próbowałem zrobić to samo dla Firemonkey, ale nie jest ładowanie kursora. Czy istnieje jakiś sposób na uzyskanie niestandardowych kursorów w Firemonkey?Jak załadować niestandardowy kursor w Firemonkey?

uses Winapi.Windows; 

procedure Tform1.Button1Click(Sender: TObject); 
const mycursor= 1; 
begin 
    Screen.Cursors[mycursor] := LoadCursorFromFile('C:\...\Arrow.cur'); 
    Button1.Cursor := mycursor; 
end; 
+0

szukasz rozwiązania wieloplatformowego? – RRUZ

+0

@RRUZ w tej chwili potrzebuję go tylko do okien, aby zmienić kursor na viewport3d – Saeed

Odpowiedz

6

ja tylko zrobiłem to dla Mac, ale ogólna idea jest taka, że ​​zaimplementować własną IFMXCursorService. Należy pamiętać, że jest to podejście całkowicie lub bezużyteczne. Będziesz musiał również zaimplementować domyślne kursory FMX.

type 
    TWinCursorService = class(TInterfacedObject, IFMXCursorService) 
    private 
    class var FWinCursorService: TWinCursorService; 
    public 
    class constructor Create; 
    procedure SetCursor(const ACursor: TCursor); 
    function GetCursor: TCursor; 
    end; 

{ TWinCursorService } 

class constructor TWinCursorService.Create; 
begin 
    FWinCursorService := TWinCursorService.Create; 
    TPlatformServices.Current.RemovePlatformService(IFMXCursorService); 
    TPlatformServices.Current.AddPlatformService(IFMXCursorService, FWinCursorService); 
end; 

function TWinCursorService.GetCursor: TCursor; 
begin 
    // to be implemented 
end; 

procedure TWinCursorService.SetCursor(const ACursor: TCursor); 
begin 
    Windows.SetCursor(Cursors[ACursor]); // you need to manage the Cursors list that contains the handles for all cursors 
end; 

To może być konieczne, aby dodać flagę do TWinCursorService tak, że będzie ona zapobiec ramy FMX, aby zastąpić kursor.

Czas jest ważny podczas rejestrowania własnej usługi kursora. Musi to być zrobione po wywołaniach FMX TPlatformServices.Current.AddPlatformService (IFMXCursorService, PlatformCocoa);

+0

dziękuję za pomoc mate, przetestowany i działa na wygranej całkiem dobrze :) – Saeed

3

Niestety, FireMonkey nie obsługuje niestandardowych kursorów. Zostało to już zgłoszone jako żądanie dotyczące funkcji w portalu jakości:

RSP-17651 Cannot load custom cursors in Firemonkey.

Po tym, kod, który pokazałeś, nie działałby w VCL. LoadCursorFromFile() zwraca uchwyt HCURSOR, ale właściwość TControl.Cursor oczekuje zamiast tego wartości indeksu z wyliczenia TCursor. To nie to samo. Podczas ładowania niestandardowego kursora należy go dodać do listy TScreen.Cursors[]. Jest to jasno określone w dokumentacji:

Vcl.Controls.TControl.Cursor

Wartość kursor znajduje się indeks kursora na liście kursorów prowadzonego przez zmienną globalną, ekran. Oprócz wbudowanych kursorów dostarczonych przez TScreen, aplikacje mogą dodawać niestandardowe kursory do listy.

Vcl.Forms.TScreen.Cursors

niestandardowe kursory mogą być dodawane do nieruchomości kursory do użytku przez aplikację lub jej kontroli. Aby dodać niestandardowy kursor do aplikacji, można ...:
... 2. Zadeklarować stałą kursora z wartością, która nie jest sprzeczna z istniejącą stałą kursora.
...
4. Ustaw właściwość Kursurs, indeksowaną przez nowo zadeklarowaną stałą kursora, na uchwyt uzyskany z LoadCursor.

Na przykład:

const 
    mycursor: TCursor = 1; // built-in values are <= 0, user-defined values are > 0 

procedure Tform1.Button1Click(Sender: TObject); 
begin 
    Screen.Cursors[mycursor] := LoadCursorFromFile('C:\...\Arrow.cur'); 
    Button1.Cursor := mycursor; 
end; 
+0

Mój błąd, zredagowałem mój kod dzięki. ale czy myślisz, że będzie możliwe zhakowanie i edycja kodu dla TPlatform.SetCursor, aby ładował niestandardowe kursory, uniemożliwiając nadpisanie kursorów do domyślnych kursorów? – Saeed

Powiązane problemy