2012-01-26 13 views
14

Aquí hay una muestra de una aplicación delphi que estoy usando usando firemonkey + Delphi XE2.Delphi Xe2 con Firemonkey: ¿Puede tener un área no cliente que esté pintada en un estilo diferente al estilo de pintura no cliente predeterminado de Windows?

Como puede ver, puede usar el estilo visual "stylebook" en Firemonkey para personalizar la apariencia de la mayoría de las cosas dentro del marco de la ventana. Sin embargo, la parte exterior del marco de la ventana se dibuja con el estilo que decida Windows. Ahora, si estuviera usando VCL en lugar de Firemonkey, podría aplicar "VCL Styles" y "skin" a toda la aplicación VCL en un esquema de color oscuro.

Supongo que esto NO ES POSIBLE con Delphi XE2 + Firemonkey. ¿Alguien puede mostrar cómo hacer esto?

enter image description here

en tiempo de diseño, la "vista previa" de su formulario muestra un bonito borde negro. Pero cuando ejecuto mi aplicación, el borde del tema "Luna" de Windows XP (las partes azules en la imagen a continuación) luce atroz. Irónicamente, el VCL es más bonito (en XE2 con estilos) que Firemonkey ...

+0

Sí. No encontré ningún video, imagen o tutorial de un estilo Firemonkey aplicado en tiempo de ejecución en un marco de Windows. Supongo que aún no es posible (o al menos no sin las habilidades de "ninja") – EMBarbosa

+0

También parece que todavía no es posible aplicar estilos a TMainMenu. –

Respuesta

4

Se puede crear un VCL formularios de solicitud, como de costumbre, con los estilos si se quiere, en tiempo de ejecución cargar el formulario de FireMonkey y establecer su forma VCL como su padre:

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; 

En la siguiente pantalla, Form1 es el aplicación VCL forma principal (al estilo de carbono) y el área de color gris oscuro con el botón es la forma FireMonkey incrustado:

Firemonkey form embedded in a VCL form

Tenga en cuenta que yo no estoy manejando el cambio de tamaño de la ventana padre - que deberían cambiar el tamaño de la emebedd forma ed, también, emulando la alineación alClient. Parece que hay muchos problemas potenciales con este enfoque, creo que hay una razón por la cual el IDE no le permite mezclar fácilmente formularios de Firemonkey con formularios VCL, advierte sobre posibles "errores de compilación o comportamiento inesperado".

+1

¡Buena idea! Tal vez en una versión futura de Delphi, puedan adaptar la base de código de los estilos de VCL para permitir el desdoblamiento del área no cliente de una aplicación firemonkey, al menos en Windows. –

+1

De acuerdo, buena idea! Solo un inconveniente: ya no es una aplicación Firemonkey ... – EMBarbosa

+0

Esto está funcionando de la caja en XE3 y versiones posteriores. http://stackoverflow.com/questions/12719749/how-do-you-style-the-non-client-area-in-a-firemonkey-fm2-application-in-delphi-x#comment17182629_12719749 –

0

Si cambia los formularios BorderStyle a bsNone, puede agregar cualquier cromo que desee. Por supuesto, necesitará manejar manualmente las acciones de maximizar, minimizar, cerrar, cambiar el tamaño, etc.

+1

Eso ni siquiera va a funcionar, porque eliminará la ventana de la lista de ventanas de la aplicación. BorderStyle = bsNone también establece WS_POPUP en Windows. –

2

Firemonkey es multiplataforma. En general, no se puede hacer nada que dependa de la plataforma dentro del propio marco FMX. Sin embargo, puede realizar llamadas a la plataforma subyacente (ya sea Windows, OSX o iOS) para acceder a la funcionalidad específica de la plataforma. Esto debe hacerse dentro del código compilado de forma condicional.

por ejemplo.

{$IF DCC} 
    something; 
{$ENDIF} 

{$IF FPC} 
    somethingelse; 
{$ENDIF} 

Viéndolo desde otro punto de vista, puede ser posible que lo hace hacer todo su trabajo de FMX en un TRectangle (por ejemplo), a continuación, utilizar AddObject (o ceder su padre), a una forma VCL.

Cuestiones relacionadas