# Screenshot vom Bereich behind dem aktuellen Fenster machen



## Steev (28. Jan 2008)

Hallo liebe Forengemeinde.

Weil es in Java ja keine Transparenten Fenster gibt, ich aber ein Fenster machen muss das eine andere Form hat als Rechteckig habe ich bevor das Fenster angezeigt wird einen Screenshot gemacht und den als Hintergrund für das Fenster genommen. Das sieht auch ganz gut aus solange man nicht auf die Idee kommt das Fenster zu verschieben. Dann stimmt das nicht mehr. Weil das suboptimal ist möchte ich nun immer einen Screenshot von dem Bereich machen auf dem das Fenster gezeichnet werden soll und ihn als hintergrund für das Fenster nehmen.

Leider ist das schwerer als ich dachte. 

Ich hoffe mir kann jemand helfen.


----------



## Wildcard (28. Jan 2008)

Steev hat gesagt.:
			
		

> Weil es in Java ja keine Transparenten Fenster gibt, ich aber ein Fenster machen muss das eine andere Form hat als Rechteckig


Das stimmt nicht. Es ist derzeit mit Swing und AWT nicht möglich. Andere Toolkits haben auch andere Möglichkeiten.
Das Screenshot Gehampel solltest du dir in jedem Fall sparen, das wird nichts.
Entweder du nimmst ein rechteckiges Fenster, oder ein anderes Toolkit (zB SWT).


----------



## The_S (28. Jan 2008)

richtig! Die Screenshot-Methode ist mehr als fehleranfällig. Selbst wenn du alles hinbekommen solltest, was machst du, wenn sich im "transparenten" Bereich deines Fensters im Hintergrund eine Animation abspielt? Spätestens hier stößt du an die Grenzen dieser Methode.


----------



## Steev (28. Jan 2008)

Danke für die schnelle Antwort. 
Und wo bekomme ich das SWT her?


----------



## Wildcard (28. Jan 2008)

Ist Google kaputt?  :shock:


----------



## L-ectron-X (28. Jan 2008)

[off topic]
_@Steev: Hattest du Probleme mit der Spamprüfung beim Wort "hinter"?
Mir ist erst gestern aufgefallen, dass jemand das Wort aus seinem Titel "ausgebaut" hat.
Das Script ist noch nicht ganz in Ordnung, daher wäre es interessant zu wissen, ob du Schwierigkeiten hattest._
[/off topic]


----------



## Steev (28. Jan 2008)

Ja, ich konnte kein hinter eingeben.

PS: Ich bin gerade noch am googeln


----------



## Steev (28. Jan 2008)

Kann ja sein das ich blöd bin. Aber ich finde nix...


----------



## The_S (28. Jan 2008)

http://www.eclipse.org/swt/ (ca. 2 Sekunden googeln => SWT Java)


----------



## Jango (28. Jan 2008)

Andere Alternative:

Wenn es ein reines Windowsprogramm werden soll, schreib es in C# - da gibt es transparente Fenster.


----------



## Steev (28. Jan 2008)

Dankeschön. Dann war ich echt blöd.


----------



## Steev (28. Jan 2008)

PS: Das Programm soll Plattformunabhängig sein. C# und C++ kenne ich. Schicke Sache! Aber ich will nunmal Java.


----------



## Steev (30. Jan 2008)

Phu, ich habe mir dieses SWT mal runtergeladen.
Das ist ja ein Murks bis man da endlich ein Fenster gebaut hat.
Ich glaube ich muss mich erst einmal in die neuen Komponenten einarbeiten weil bei SWT ja wirklich alles anders ist als bei AWT oder Swing.
Ich glaube ich mache das ohne Transparenz und in Swing.


Gibt es kein kleines Programm das man per exec aufrufen kann und das eine bestimmte Farbe im Fenster transparent macht oder so?


----------



## The_S (30. Jan 2008)

??? Was soll das denn sein un wie soll das gehen?


----------



## Steev (30. Jan 2008)

Ich denke an ein Programm das in C oder C++ oder C# etc. geschrieben worden ist.

Ich habe mal so eins gesehen das alle Fenster zu 80 % durchsichtig macht. Es gibt da doch sicher eine Möglichkeit, dass man einem solchen Programm als Parameter den Programmnamen übergibt oder so.


----------



## Wildcard (30. Jan 2008)

Ein nicht rechteckiges Fenster:
http://dev.eclipse.org/viewcvs/inde.../src/org/eclipse/swt/snippets/Snippet134.java

```
import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

public class Snippet134 {

static int[] circle(int r, int offsetX, int offsetY) {
	int[] polygon = new int[8 * r + 4];
	//x^2 + y^2 = r^2
	for (int i = 0; i < 2 * r + 1; i++) {
		int x = i - r;
		int y = (int)Math.sqrt(r*r - x*x);
		polygon[2*i] = offsetX + x;
		polygon[2*i+1] = offsetY + y;
		polygon[8*r - 2*i - 2] = offsetX + x;
		polygon[8*r - 2*i - 1] = offsetY - y;
	}
	return polygon;
}

public static void main(String[] args) {
	final Display display = new Display();
	//Shell must be created with style SWT.NO_TRIM
	final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
	shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
	//define a region that looks like a key hole
	Region region = new Region();
	region.add(circle(67, 67, 67));
	region.subtract(circle(20, 67, 50));
	region.subtract(new int[]{67, 50, 55, 105, 79, 105});
	//define the shape of the shell using setRegion
	shell.setRegion(region);
	Rectangle size = region.getBounds();
	shell.setSize(size.width, size.height);
	//add ability to move shell around
	Listener l = new Listener() {
		Point origin;
		public void handleEvent(Event e) {
			switch (e.type) {
				case SWT.MouseDown:
					origin = new Point(e.x, e.y);
					break;
				case SWT.MouseUp:
					origin = null;
					break;
				case SWT.MouseMove:
					if (origin != null) {
						Point p = display.map(shell, null, e.x, e.y);
						shell.setLocation(p.x - origin.x, p.y - origin.y);
					}
					break;
			}
		}
	};
	shell.addListener(SWT.MouseDown, l);
	shell.addListener(SWT.MouseUp, l);
	shell.addListener(SWT.MouseMove, l);
	//add ability to close shell
	Button b = new Button(shell, SWT.PUSH);
	b.setBackground(shell.getBackground());
	b.setText("close");
	b.pack();
	b.setLocation(10, 68);
	b.addListener(SWT.Selection, new Listener() {
		public void handleEvent(Event e) {
			shell.close();
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	region.dispose();
	display.dispose();
}
}
```


----------



## The_S (30. Jan 2008)

Dexpot kann das z. B. (auch wenn das damit dann ein bisschen zweckentfremdet wird  ). Aber ob man damit auch teilbereiche transparent bekommt ... kA


----------



## Steev (30. Jan 2008)

Danke für eure Antworten,
ich werde den Code mal ausprobieren.

@Hobbit:
Dexpot habe ich noch nie gehört. Ich suche mal danach. Zur Zeit habe ich keine Zeit mich in SWT reinzuarbeiten. Wir machen alles mit Swing... Da kann so ein Programm von nutzen sein.
Ich google mal.
[edit:] Gufunden! Mal sehen...

Danke vorerst


----------



## Steev (31. Jan 2008)

@Wildcard:
Dankeschön, das war genau das was ich gebraucht habe.
Ich denke ich fange doch mal mit SWT an.

@Hobbit:
Nettes Tool.


----------



## Steev (6. Feb 2008)

Kleine Frage nochmal,
ich habe es hinbekommen mit SWT ein rundes Fenster zu machen. Kann man mit SWT auch durchsichtige Fenster machen?

Also ein Fenster durch das man den Hintergrund etwas sieht (s.B. zu 50%)


----------



## Wildcard (6. Feb 2008)

Nur so:

```
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Snippet180 {

public static void main(String[] args) {
	Display display = new Display();
	final Image image = display.getSystemImage(SWT.ICON_WARNING);
	//Shell must be created with style SWT.NO_TRIM
	final Shell shell = new Shell(display, SWT.NO_TRIM | SWT.ON_TOP);
	shell.setBackground(display.getSystemColor(SWT.COLOR_RED));
	//define a region 
	Region region = new Region();
	Rectangle pixel = new Rectangle(0, 0, 1, 1);
	for (int y = 0; y < 200; y+=2) {
			for (int x = 0; x < 200; x+=2) {
				pixel.x = x;
				pixel.y = y;
				region.add(pixel);
			}
		}
	//define the shape of the shell using setRegion
	shell.setRegion(region);
	Rectangle size = region.getBounds();
	shell.setSize(size.width, size.height);
	shell.addPaintListener(new PaintListener() {
		public void paintControl(PaintEvent e) {
			Rectangle bounds = image.getBounds();
			Point size = shell.getSize();
			e.gc.drawImage(image, 0, 0, bounds.width, bounds.height, 10, 10, size.x-20, size.y-20);
		}
	});
	shell.open();
	while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
	}
	region.dispose();
	display.dispose();
}
}
```


----------



## Steev (6. Feb 2008)

Dankeschön, das reicht mir erst mal.


----------



## JBenutzername (6. Feb 2008)

Transparente und nicht-rechteckige Fenster kann man auch mit Swing sehr einfach umsetzen, wenn man dazu JNA (https://jna.dev.java.net/) benutzt. In einem Beispiel-Package gibt es die Klasse WindowUtil die das kann (Windows, Linux, Mac OS).

Beispiel für Transparenz:

```
JFrame f = new JFrame();
...
WindowUtils.setWindowAlpha(f, 0.5f);
f.setVisible(true);
```


----------



## Wildcard (6. Feb 2008)

JBenutzername hat gesagt.:
			
		

> In einem Beispiel-Package gibt es die Klasse WindowUtil die das kann (Windows, Linux, Mac OS).


Die meisten (bodenständigen) Windows Manager von Linux und meines Wissens auch Mac OS (auch wenn es transparenzeffekte hat) unterstützen doch gar keine transparenten Fenster


----------



## Steev (7. Feb 2008)

Hey, super. Dann kann ich doch Swing benutzen. SWT finde ich nämlich irgendwie schrecklich ^^

Dankeschön.


----------

