# Transparenz mit SWT



## tuxedo (23. Apr 2008)

Hallo zusammen,

ich sitz vor einem etwas doofen Problem:

Unsere Java-Anwendung soll über ein ActiveX-Control welches ich gerade schreibe, Videostreams anzeigen. Mittels SWT wird dieses Control geladen in als OleControlSite in einem OleFrame in der Anwendung angezeigt. Das funktioniert schon prima.

Jetzt geht's aber drum, dass man "Overlays" auf das Video setzen kann. Im Prinzip nix wildes. Der DirectShow Videorenderer kann ein Bitmap als Overlay über das Video legen. Auch mit Transparenz und Alpha-Transparenz. 

Damit sollen z.B. die Namen der Videoquellen über das Video gelegt werden können. 

Da man mit den Overays aber von Java aus noch interagieren können soll, sehe ich da das eine oder andere Problem:

Zum einen muss ich auf ActiveX Seite Mausevents abfangen und an Java/SWT weiterleiten und vor allem noch "herausfinden" auf welches Overlay (es kann durchaus mehrere auf einem Video geben) geklickt wurde. 

Die Dokumentation seitens Visual C++ etc. ist ziemlich sch**sse, da es offensichtlich kaum Leute gibt die so tief unten auf dem VideoRenderer arbeiten.

Also hab ich mir gedacht: Wieso macht man das mit den Overlays nicht von Java aus? SWT müsste ja transparenz können, so dass ich sozusagen mittels Null-Layout einzelne Composites (oder so, kenn mich in SWT noch nicht so aus) auf das Video platziere. Prinzipiell geht das auch schon. Denn das war die bisherige vorgehensweise. Nun sollen diese Overlays (welche Text und/oder Bilder enthalten können) aber einen Transparenten Hintergrund haben können (als Option auch einen farbigen), und das ganze Overlay an sich soll später auch noch Alphatransparenz können (man soll durch den Text/das Bild hindurch das darunterliegende Video sehen können).

Nun meine Frage an die SWT-Spezis hier:

LÄsst sich das mit SWT realisieren? Gibts Codeschnipsel für die Transparenzgeschichte (hab jetzt noch nix wirkliches gefunden).

Weil wenn das ganze in Java machbar ist, dann wäre das wohl schneller und geschickter zu realisieren, wie wenn ich das unten auf dem Renderer des DirectShow Graphen mache und von da aus auch noch Mausevents weiterriechen und steuern muss.

- Alex


----------



## Wildcard (23. Apr 2008)

Eine SWT Shell hat keinen Alphakanal sondern nur Bitmasken Ttransparenz. Was du dann auf dieser Shell zeichnest, kann natürlich transparent sein, aber das wird dir wohl nichts nützen.


----------



## tuxedo (23. Apr 2008)

Also würde alles bis auf Alphatransparenz funktionieren? D.h. ich kann einen Text auf das Video-Control zeichnen und den Texthintergrund so transparent halten dass ich das darunterliegende Video sehe?

- Alex


----------



## Wildcard (23. Apr 2008)

Ist das Video denn ein SWT Widget, also sind Overlay und Video in der gleichen SWT Shell enthalten?


----------



## byte (24. Apr 2008)

Die neue SWT Version ab Eclipse 3.4 M3 kann nun Alpha auf Shells:
http://download.eclipse.org/eclipse/downloads/drops/S-3.4M3-200711012000/eclipse-news-M3.html


----------



## tuxedo (24. Apr 2008)

Wildcard hat gesagt.:
			
		

> Ist das Video denn ein SWT Widget, also sind Overlay und Video in der gleichen SWT Shell enthalten?



Hmm, da frägst du mich jetzt was. Bin mit SWT noch nicht so ganz vertraut. Muss ich eben mal in den Code schauen *mom*


Jupp. Overlay und Video müssten in der gleichen Shell sein. Macht das einen Unterschied?

@byto 
Danke für den Link. Ich geh dann mal gucken ...

- Alex


----------



## tuxedo (24. Apr 2008)

Also ich hab jetzt ein wenig gespielt und gebastelt:


```
Composite c = new Composite(sShell, SWT.NONE);
        c.setBounds(new Rectangle(576, 327, 180, 180));
        
        c.addPaintListener(new PaintListener(){

            public void paintControl (PaintEvent e)
            {
                e.gc.setForeground(new Color(sShell.getDisplay(),255,0,0));
                e.gc.drawLine(0,0,180,180);
                
                
            }
            
        });
```

Ich hab ein Shell mit Null-Layout in dem ich mein OleFrame, welches mein "OleControlSite" (also mein VideoControl) beinhaltet, platziert habe.

Dazu hab ich noch obiges Composite hinzugefügt. Von der Reihenfolge her liegt das Composite "über" dem OleFrame. 

So. Laut Doku die ich im Netz gefunden habe, kann man die Childs einer Komponente mit "setBackgroundMode(SWT.INHERIT_DEFAULT);" dazu bringen, den selben Hintergrund wie das Parent anzunehmen. Man erreicht dadurch also die Transparenz. Prima. 

Ich hab also meiner Shell einen weißen Hintergrund gegeben und das Composite wie oben gezeigt eingebaut.  Das Composite hat den selben weißen Hintergrund wie mein Shell und die rote Linie wird auchgezeichnet. 

Lasse ich das "setBackgroundMode", welches ich auf das Shell angewendet habe weg, so wird der Hintergrund meines Composites wieder grau. Alles bestens.

So, wenn ich ich jetzt das Composite beim Erzeugen nicht an mein Shell knüpfe, sondern wahlweise an mein OleFrame oder an mein OleControlSite (hab beides ausprobiert), dann funktioniert das nicht mehr. Es scheint so als würde mein ActiveX Control immer zuletzt gezeichnet, womit ich dann alles, was ich damit sonst noch verknüpft habe (also mein Test-Composite), übermale. 
Ich hab testweise das Video erst gar nicht laufen lassen, sondern nur mal einen schwarzen Hintergrund im ActiveX Control (also auf C++ Seite) gemalt. Auch das reicht schon aus um das Composite auf Java-Seite zu verdecken. 

Das ist nicht gut. So wie's aussieht werde ich nicht drum rum kommen das ganze mit dem Overlay auf C++ Seite zu machen. Schade.

Oder hat noch jemand ne brilliante Idee die ich testen könnte?

- Alex


----------



## tuxedo (24. Apr 2008)

So, auf C++ Ebene geht's auch nicht besser. Dort dominiert das Zeichnen des Videos ebenfalls. Und auch auf Video-Renderer-Ebene gibts Probleme. Dort klappt zwar das mit der Transparenz, aber mein Overlay, bzw. der Text lässt sich nicht in einer gleichbleibenden Größe bei sich ändernder Darstellungsgröße auf dem Video darstellen. 

Wenns also mit SWT keine Lösung gibt, dann war's das erstmal mit Transparenz...

- Alex


----------

