2010-09-02 8 views
6

Como proyecto favorito, he estado jugando con el concepto de integrar los efectos Aero Glass en mi aplicación SWT. Łukasz Milewski has an excellent blog post explicar cómo esto se puede lograr, que prácticamente se reduce a esto:Combinación de efectos Aero Glass y SWT

final Display display = new Display(); 
final Shell shell = new Shell(display); 
shell.setLayout(new FormLayout()); 
final MARGINS margins = new MARGINS(); 
margins.cyTopHeight = -1; 

final Composite c = new Composite(shell, SWT.NORMAL); 
c.setBackground(new Color(shell.getDisplay(), new RGB(0, 0, 0))); 
final FormData fd = new FormData(); 
fd.top = new FormAttachment(0, 0); 
fd.left = new FormAttachment(0, 0); 
fd.right = new FormAttachment(100, 0); 
fd.bottom = new FormAttachment(100, 0); 
c.setLayoutData(fd); 

OS.DwmExtendFrameIntoClientArea(shell.handle, margins); 

shell.open(); 
while (!shell.isDisposed()) { 
    if (!display.readAndDispatch()) { 
     display.sleep(); 
    } 
} 

Esto funciona muy bien, hasta que desee agregar un control. Esto se traduce en negro transparente restante:

Transparent shell with control

A follow-up post demuestra cómo hacer esto, también, pero requiere la modificación de la biblioteca SWT. (Al menos, creo que sí, porque las funciones SWT privadas se anulan con @Override.)

¿Cómo puedo evitar que los controles se vuelvan transparentes? Aún mejor: ¿cómo puedo beneficiarme de la transparencia (por ejemplo, colocar imágenes en él like so), pero usarlo de manera sensata?

+1

¿Puedes agregar enlaces activos? – Supuhstar

Respuesta

2

Los métodos reemplazados son "paquete privado". Para anularlos sin errores de tiempo de compilación, debe colocar sus clases en el mismo paquete que la superclase, es decir, org.eclipse.swt o org.eclipse.swt.widgets. El blog que cite la publicación en realidad menciona este detalle de implementación al final, así que no sé, esto realmente responde a su pregunta.

+0

Simplemente leí justo después de eso. Sin duda, eso permite que todo se compile sin problemas, pero todavía hay muchas cosas que no funcionan correctamente. Un ejemplo totalmente funcional sería genial, ya que solo al configurar algunas constantes y algunos casos adicionales en 'callWindowProc()' puedo obtener 'OpaqueText' para mostrar efectivamente el texto opaco. Actualizaré mi pregunta con mi código actual por la mañana. –

+0

Como la recompensa está por vencer, te la otorgaré. –

0

Ponga su control más allá del área de cristal o intente utilizar el color de fondo de la fuerza para el control.

+0

Colocar mi control fuera del área de vidrio más o menos derrota el propósito del efecto. Tampoco considero que "evitar el negro" sea una opción realista. Sé que hay una forma de hacerlo correctamente (un colega mencionó resolver un problema similar en C#), así que seguiré analizando el tema. –

0

Le preocupa la solución que anula los métodos internos, pero está utilizando una clase SWT interna en primer lugar. Esto parece una forma frágil muy chistosa (al menos en la implementación actual de SWT) para agregar un poco de caramelo a tu aplicación ... Espero que no estés haciendo esto en el código de producción.

+0

Envolviéndolo en un 'try {...} catch (Throwable e) {}' seguramente no puede doler. Es solo un caramelo, así que si falla, no hay problema, ¿verdad? Hay algunas referencias 'OS' en el código de producción actual, implementadas así. ¿Es realmente una mala práctica? –

+0

Tampoco es tanto una * preocupación * mía sobrepasar los métodos privados; es más que simplemente no puedo hacerlo sin errores de compilación. ¿Qué estoy haciendo mal? –

Cuestiones relacionadas