2009-12-03 3 views
6

Je vous serais très reconnaissant de vos conseils et de l'aide:SWT: Comment « rendre » Widget en arrière-plan/dans un offscreenbuffer

Comment puis-je rendre un SWT Widget/Component dans l'arrière-plan (? Offscreenbuffer) et obtenir les « peintes » pixels qui ont été tirées par le Widget/Component pour les enregistrer sur le disque dur:

ce que j'ai actuellement est:

Display display = new Display(); 
Shell shell = new Shell(display); 
// ... 
MyWidgetComponent mwc = new MyWidgetComponent(shell, SWT.BORDER); 
shell.open(); 
Image screenshot = new Image(shell.getDisplay(), shell.getBounds()); 
GC.copyArea(screenshot, 0, 0); 
//... 

problème: Prendre la capture d'écran lui-même du shell/widget de fonctionne, mais il va ouvrir un nouveau Windo w dans la barre des tâches. C'est quelque chose que je ne veux pas. Ce que je veux réaliser est: Je veux exécuter cette application complètement en arrière-plan en tant qu '«application serveur» (par exemple, l'incorporer et l'appeler dans une servlet). Donc, le composant MyWidgetComponent doit être rendu pixel par pixel complètement dans le buffer offscreen et plus tard je récupère les pixels et les enregistre sur le disque dur ou retourne directement le widget rendu en tant qu'image à la suite de la requête servlet. (Je ne veux pas faire de fenêtres dans un environnement serveur, au cas où cela pourrait être un serveur Windows ...).

Comment puis-je y parvenir. J'ai beaucoup cherché mais je n'ai rien trouvé d'utile.

Merci beaucoup !! Jan

Répondre

2

Je ne peux pas répondre directement à votre question, mais je l'ai rencontré un problème similaire que je me débattais avec: prendre une capture d'écran d'un Shell ou Widget alors qu'il est obstruée de la vue. Par exemple, considérons la fenêtre A qui chevauche la fenêtre B. Une capture d'écran est fait de B en utilisant votre code:

Image screenshot = new Image(shellB.getDisplay(), shellB.getBounds()); 
GC.copyArea(screenshot, 0, 0); 

Mes résultats ont révélé que cela pourrait se faire sous Windows Vista, Windows 7 et Mac OS X (bien que je ne suis pas sûr de ce dernier). Cependant, sous Windows XP, Linux avec GNOME et Linux avec KDE, la capture d'écran contient une zone blanche où la fenêtre qui se chevauche entrave la vue.

Je n'ai pas trouvé de solution pour cela, et je soupçonne que non seulement ce comportement dépend de la plate-forme, mais aussi assez bogué dans SWT. Je aimerais entendre que je suis hors de la marque, cependant!

+0

Bonjour Paul, merci beaucoup pour votre réponse !! Votre réponse est très intéressante à lire. J'ai fait une expérience similaire (qui pourrait être évidente pour les experts, mais pas moi) qui rend le rendu "côté serveur" encore plus problématique: Comme décrit ci-dessus, une fenêtre apparaîtra toujours, mais non seulement cette fenêtre apparaît elle aussi être "VISIBLE/MAXIMIZED" et n'est pas autorisé à être "minimisé" (de sorte que seule une icône de barre de tâches/barre des tâches s'affiche), comme dans un état réduit, je reçois également un "écran blanc" screendumped. Cela signifie donc que la fenêtre doit être entièrement affichée ce qui est encore pire dans un environnement serveur. – jan

+0

Il semble que ce soit le dernier mot, en ce qui concerne SWT. Notez que vous pouvez contourner ce problème en utilisant JNI/JNA en accédant aux API Windows ou en appelant des méthodes natives Mac. Pas très glamour, mais il pourrait juste faire le travail. –

+0

Cela devrait être un bug soulevé contre SWT. Je viens de passer 5 heures à y consacrer du temps, et j'ai eu le même problème. – Phil

Questions connexes