2010-09-02 10 views
6

Als Lieblingsprojekt habe ich mit dem Konzept der Integration von Aero Glass Effekten in meine SWT Anwendung gespielt. Łukasz Milewski has an excellent blog post zu erklären, wie dies erreicht werden kann, was ziemlich viel läuft darauf hinaus, diese nach unten:Kombination von Aero Glass Effekten und 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(); 
    } 
} 

Dieses schön funktioniert, bis Sie ein Steuerelement hinzufügen möchten. Dies führt in schwarz transparent bleibt:

Transparent shell with control

A follow-up post zeigt, wie dies zu tun, auch, aber erfordert die SWT-Bibliothek zu modifizieren. (Zumindest glaube ich das, weil private SWT-Funktionen mit @Override übersteuert werden.)

Wie kann ich vermeiden, dass Kontrollen transparent werden? Noch besser: Wie kann ich von Transparenz profitieren (z. B. Bilder darauf platzieren like so), aber es sinnvoll nutzen?

+1

Können Sie lebende Links hinzufügen? – Supuhstar

Antwort

2

Die überschriebenen Methoden sind "Paket privat". Um sie ohne Kompilierzeitfehler zu überschreiben, müssen Sie Ihre Klassen in das gleiche Paket wie die Superklasse setzen, d. H. org.eclipse.swt oder org.eclipse.swt.widgets Paket. Der Blog, den du zitierst, erwähnt am Ende dieses Implementierungsdetail, also weiß ich es nicht, es beantwortet deine Frage wirklich.

+0

Ich lese einfach direkt danach. Sicherlich erlaubt das alles kompilieren ohne Probleme, aber es gibt viele Dinge, die immer noch nicht richtig funktionieren. Ein vollständig funktionierendes Beispiel wäre großartig, denn nur durch das Setzen einiger Konstanten und einiger zusätzlicher Fälle in 'callWindowProc()' kann 'OpaqueText' tatsächlich undurchsichtigen Text anzeigen. Ich werde meine Frage am Morgen mit meinem aktuellen Code aktualisieren. –

+0

Da die Bounty ausläuft, werde ich es Ihnen vergeben. –

0

Setzen Sie Ihre Kontrolle über den Glasbereich hinaus oder versuchen Sie, die Hintergrundfarbe für die Kontrolle zu verwenden.

+0

Wenn ich meine Kontrolle außerhalb des Glasbereichs platziere, wird der Zweck des Effekts mehr oder weniger zunichte gemacht. Ich halte "Schwarz vermeiden" auch nicht für eine realistische Option. Ich weiß, dass es eine Möglichkeit gibt, das richtig zu machen (ein Kollege erwähnt, dass ein ähnliches Problem in C# gelöst wurde), also werde ich weiter daran arbeiten. –

0

Sie sind besorgt über die Lösung, die interne Methoden überschreibt, aber Sie verwenden eine interne SWT-Klasse an erster Stelle. Dies scheint ein sehr zerbrechlicher Weg (zumindest in der aktuellen SWT-Implementierung) zu sein, um deiner App ein paar Augenweiden hinzuzufügen ... Ich hoffe, du tust das nicht im Produktionscode.

+0

Das Wrapping in einem "try {...} catch (Throwable e) {}' kann sicherlich nicht schaden. Es ist nur eine Augenweide, also wenn es scheitert, kein Problem, oder? Es gibt einige OS-Referenzen im aktuellen Produktionscode, die so implementiert sind. Ist das wirklich eine sehr schlechte Übung? –

+0

Es geht mir auch nicht so sehr darum, private Methoden außer Kraft zu setzen; Es ist mehr, dass ich es ohne Kompilierungsfehler nicht schaffen kann. Was mache ich falsch? –