2012-01-26 14 views
14

Oto przykład aplikacji Delphi, którą robię przy użyciu firemonkey + Delphi XE2.Delphi Xe2 z Firemonkey: Czy możesz mieć obszar poza klientem, który jest namalowany w stylu innym niż domyślny styl malowania systemu Windows nonclient?

Jak widać, można użyć stylu wizualnego "stylebook" w Firemonkey, aby dostosować wygląd większości elementów wewnątrz ramy okna. Jednak zewnętrzna część ramy okna jest rysowana przy użyciu dowolnego stylu, jaki decyduje o tym system Windows. Gdybym używał VCL zamiast Firemonkey, mógłbym zastosować "Style VCL" i "skin" całą aplikację VCL w ciemnym schemacie kolorów.

Domyślam się, że to NIE JEST możliwe z Delphi XE2 + Firemonkey. Czy ktoś może pokazać, jak to zrobić?

enter image description here

Na designtime, "Podgląd" z formularza pokazuje piękny czarną obwódką. Ale kiedy uruchamiam swoją aplikację, obramowanie motywu "Luna" systemu Windows XP (niebieskie części na zdjęciu poniżej) wygląda okropnie. Jak na ironię, VCL jest ładniejszy (w XE2 ze stylami) niż Firemonkey ...

+0

Tak. Nie znalazłem wideo, obrazu ani samouczka stylu Firemonkey zastosowanego w środowisku wykonawczym na ramie okna. Przypuszczam, że nie jest to możliwe (lub przynajmniej nie bez umiejętności "ninja"). – EMBarbosa

+0

Wydaje się również, że nie można jeszcze zastosować stylów do TMainMenu. –

Odpowiedz

4

Można utworzyć VCL Forms, jak zwykle, ze stylami, jeśli chcesz, w czasie wykonywania załadować Firemonkey formularz i ustawić formularz VCL jako jego rodzica:

uses 
    FMX.Platform.Win, FMX.Forms, 
    Unit2; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    Form2: TForm2; 
begin 
    Form2 := TForm2.Create(nil); 
    Form2.BorderStyle := FMX.Forms.TFmxFormBorderStyle.bsNone; 
    Form2.SetBounds(0, 0, ClientWidth, ClientHeight); 
    Winapi.Windows.SetParent(FmxHandleToHWND(Form2.Handle), Handle); 
    Form2.Show; 
end; 

W poniższym zrzucie ekranu, Form1 jest aplikacja VCL główną formą (w stylu Carbon) i ciemno-szary obszar za pomocą przycisku jest wbudowany formularz Firemonkey:

Firemonkey form embedded in a VCL form

należy pamiętać, że nie jestem obsługi zmianę rozmiaru okna nadrzędnego - powinien zmienić rozmiar emebedd ed także, emulując wyrównanie alClient. Wydaje się, że istnieje wiele potencjalnych problemów z tym podejściem - myślę, że istnieje powód, dla którego IDE nie pozwala łatwo łączyć form Firemonkey z formularzami VCL - ostrzega przed możliwymi "błędami kompilacji lub nieoczekiwanym zachowaniem".

+1

Niezły pomysł! Być może w przyszłej wersji Delphi, mogą zaadaptować kodowanie stylów VCL, aby umożliwić skórowanie nie-klienckich obszarów aplikacji firemonkey, przynajmniej w systemie Windows. –

+1

Uzgodniony, fajny pomysł! Tylko jedna wada: To już nie jest aplikacja Firemonkey ... – EMBarbosa

+0

To działa teraz po wyjęciu z pudełka w XE3 i później. http://stackoverflow.com/questions/12719749/how-do-you-style-the-non-client-area-in-a-firemonkey-fm2-application-in-delphi-x#comment17182629_12719749 –

0

Jeśli zmienisz formę BorderStyle na bsNone, możesz dodać dowolny chrom. Będziesz oczywiście musiał ręcznie obsługiwać maksymalizowanie, minimalizowanie, zamykanie, zmienianie itp. Działań.

+1

To nadal nie zadziała, ponieważ usunie okno z listy okien aplikacji. BorderStyle = bsNone ustawia również WS_POPUP w systemie Windows. –

2

Firemonkey to platforma krzyżowa. W zasadzie nie można zrobić nic, co jest zależne od platformy w ramach samej struktury FMX. Możesz jednak wykonywać połączenia z podstawową platformą (np. Windows, OSX lub iOS), aby uzyskać dostęp do funkcji specyficznych dla platformy. Powinno to zostać wykonane w ramach warunkowo skompilowanego kodu.

np.

{$IF DCC} 
    something; 
{$ENDIF} 

{$IF FPC} 
    somethingelse; 
{$ENDIF} 

Patrząc na to z innego punktu widzenia, może to być możliwe, zrobić to wszystko zrobić swoją pracę FMX na TRectangle (na przykład), a następnie użyć AddObject (lub przypisać jej rodziców), do postaci VCL.