Combinaison d’effets Aero Glass et SWT

En tant que projet animalier, j’ai joué avec le concept d’intégration des effets Aero Glass dans mon application SWT. Łukasz Milewski a un excellent article de blog expliquant comment cela peut être accompli, ce qui se résume à ceci:

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(); } } 

Cela fonctionne à merveille, jusqu’à ce que vous souhaitiez append un contrôle. Il en résulte que le noir rest transparent:

Coque transparente avec contrôle

Une publication de suivi montre également comment procéder, mais il faut modifier la bibliothèque SWT. (Au moins, je le crois, car les fonctions SWT privées sont remplacées par @Override .)

Comment puis-je éviter que les contrôles ne deviennent transparents? Encore mieux: comment puis-je bénéficier de la transparence (par exemple, y placer des images de la sorte ), mais l’utiliser de manière judicieuse?

Les méthodes remplacées sont “package private”. Pour les remplacer sans erreurs de compilation, vous devez placer vos classes dans le même package que la classe super, à savoir le org.eclipse.swt ou org.eclipse.swt.widgets . Le blog que vous citez post mentionne en fait ce détail d’implémentation à la fin, donc je ne sais pas, cela répond vraiment à votre question.

Mettez votre contrôle au-delà de la surface vitrée ou essayez d’utiliser la couleur d’arrière-plan pour le contrôle.

Vous êtes concerné par la solution qui remplace les méthodes internes, mais vous utilisez en premier lieu une classe SWT interne. Cela semble être un moyen très pirate (au moins dans la mise en œuvre actuelle de SWT) pour append des éléments visuels à votre application … J’espère que vous ne le faites pas en code de production.