2010-09-02 4 views
6

En tant que projet favori, j'ai joué avec le concept de l'intégration des effets Aero Glass dans mon application SWT. Łukasz Milewski has an excellent blog post expliquant comment cela peut être accompli, ce qui se résume assez bien à ceci:Combinaison d'effets Aero Glass et 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(); 
    } 
} 

Cela fonctionne à merveille, jusqu'à ce que vous voulez ajouter un contrôle. Il en résulte transparent reste noir:

Transparent shell with control

A follow-up post montre comment faire, aussi, mais nécessite de modifier la bibliothèque de SWT. (Au moins, je crois, car les fonctions SWT privées sont remplacées par @Override.)

Comment puis-je éviter que les contrôles deviennent transparents? Encore mieux: comment puis-je bénéficier de la transparence (par exemple en plaçant des images dessus like so), mais l'utiliser de manière sensée? Mettez votre contrôle au-delà de la zone vitrée ou essayez d'utiliser la force Couleur de fond pour le contrôle

+1

Pouvez-vous ajouter des liens vivants? – Supuhstar

Répondre

2

Les méthodes substituées sont "paquet privé". Afin de les remplacer sans erreur de compilation, vous devez placer vos classes dans le même paquet que la super classe, c'est-à-dire le paquet 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.

+0

J'ai simplement lu juste après cela. Assez, cela permet de tout compiler sans aucun problème, mais il y a beaucoup de choses qui ne fonctionnent toujours pas correctement. Un exemple de travail complet serait génial, car seulement en mettant des constantes et quelques cas supplémentaires dans 'callWindowProc()' je peux obtenir 'OpaqueText' pour afficher du texte opaque. Je vais mettre à jour ma question avec mon code actuel le matin. –

+0

Puisque la prime expire, je vais vous l'attribuer. –

0

+0

Placer mon contrôle à l'extérieur de la zone de verre annule plus ou moins le but de l'effet. Je ne considère pas "évitant le noir" une option réaliste, soit. Je sais qu'il existe une façon de le faire correctement (un collègue a mentionné la résolution d'un problème similaire en C#), alors je vais continuer à le faire. –

0

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 une manière très hacky fragile (au moins dans la mise en œuvre SWT actuelle) pour ajouter un peu de bonbon à votre application ... J'espère que vous ne le faites pas dans le code de production.

+0

Envelopper dans un 'try {...} catch (Throwable e) {}' ne peut sûrement pas faire de mal. C'est juste un bonbon pour les yeux, donc si ça échoue, pas de gros truc, non? Il y a des références 'OS' dans le code de production actuel, implémentées comme ça. Est-ce vraiment une très mauvaise pratique? –

+0

Il ne s'agit pas non plus vraiment d'une préoccupation de la part de la mienne d'outrepasser les méthodes privées; c'est plus que je ne peux tout simplement pas le faire sans erreurs de compilation. Qu'est-ce que je fais mal? –