2012-01-26 8 views
14

Ecco un esempio di un'applicazione delphi che sto utilizzando usando Firemonkey + Delphi XE2.Delphi Xe2 con Firemonkey: puoi avere un'area non client dipinta in uno stile diverso dallo stile di disegno nonclient predefinito di Windows?

Come si può vedere, è possibile utilizzare lo "stile di stile" di stile visivo in Firemonkey per personalizzare l'aspetto della maggior parte delle cose all'interno della cornice della finestra. Tuttavia, l'esterno della cornice della finestra viene disegnato utilizzando qualsiasi stile decida da Windows. Ora, se stavo usando VCL al posto di Firemonkey, potevo applicare "VCL Styles" e "skin" l'intera applicazione VCL in uno schema di colori scuri.

La mia ipotesi è che questo NON È ANCORA possibile con Delphi XE2 + Firemonkey. Qualcuno può mostrare come farlo?

enter image description here

Al designtime, la "preview" del modulo mostra un bel bordo nero. Ma quando eseguo la mia app, il bordo del tema "Luna" di Windows XP (le parti blu nella figura sotto) sembra atroce. Ironia della sorte, il VCL è più carino (in XE2 con stili) rispetto a Firemonkey ...

+0

Sì. Non ho trovato alcun video, immagine o tutorial di uno stile Firemonkey applicato in runtime su un frame di Windows. Suppongo che non sia ancora possibile (o almeno non senza le abilità di "ninja") – EMBarbosa

+0

Sembra anche che non sia ancora possibile applicare gli stili a TMainMenu. –

risposta

4

È possibile creare una VCL I moduli di domanda, come al solito, con gli stili, se volete, in fase di esecuzione caricare il modulo FireMonkey e impostare il modulo VCL come suo genitore:

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; 

Nel seguente screenshot, Form1 è il modulo principale dell'applicazione VCL (con stile Carbon) e l'area grigio scuro con il tasto è la forma FireMonkey incorporato:

Firemonkey form embedded in a VCL form

si noti che non sto gestire il ridimensionamento della finestra padre - dovrebbe ridimensionare la emebedd anche la forma, che emula l'allineamento alClient. Sembra che ci siano molti potenziali problemi con questo approccio - penso che ci sia un motivo per cui l'IDE non ti permette di mescolare facilmente i moduli Firemonkey con i moduli VCL - avverte riguardo a possibili "errori di compilazione o comportamenti imprevisti".

+1

Bella idea! Forse in una versione futura di Delphi, potrebbero adattare il codice base degli stili VCL per consentire lo skinning dell'area non client di un'applicazione firemonkey, almeno su Windows. –

+1

Concordato, buona idea! Unico inconveniente: non è più un'applicazione Firemonkey ... – EMBarbosa

+0

Ora funziona fuori dalla scatola in XE3 e versioni successive. http://stackoverflow.com/questions/12719749/how-do-you-style-the-non-client-area-in-a-firemonkey-fm2-application-in-delphi-x#comment17182629_12719749 –

0

Se si modificano i moduli BorderStyle in bsNone, è possibile aggiungere qualsiasi chrome desiderato. Ovviamente, dovrai gestire manualmente le operazioni di massimizzazione, minimizzazione, chiusura, ridimensionamento, ecc.

+1

Non funziona ancora, perché rimuoverà la finestra dall'elenco delle finestre dell'applicazione. BorderStyle = bsNone imposta anche WS_POPUP su Windows. –

2

Firemonkey è multipiattaforma. Nel complesso non è possibile fare nulla che dipenda dalla piattaforma all'interno del framework FMX stesso. È comunque possibile effettuare chiamate alla piattaforma sottostante (che si tratti di Windows, OSX o iOS) per accedere a funzionalità specifiche della piattaforma. Questo dovrebbe essere fatto all'interno di un codice condizionato compilato.

es.

{$IF DCC} 
    something; 
{$ENDIF} 

{$IF FPC} 
    somethingelse; 
{$ENDIF} 

Guardando la cosa da un altro punto di vista, può essere possibile per fare fare tutto il lavoro FMX su un TRectangle (per esempio), quindi usare AddObject (o assegnare il suo genitore), ad una forma VCL.

Problemi correlati