Autor Beitrag
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 09.01.08 20:15 
Wie verwende ich ein Fenster mit Transpranenzen?

Hallo,

ich habe für mein aktuelles Programm einen eleganten Style gemacht, und will deshalb auch für Dialog etc. eine passendes Design verwenden. Dazu habe ich schon PNG-Dateien mit Verwendung des Alpha-Kanals gemacht, und diese in ein Formular eingefügt. Es gibt bis jetzt nur Images im Formular, also nichts, was der Transparenz im Weg stehen sollte.

Im DSDT habe ich schon den passenden Weg gefunden, ein Formular unsichtbar zu machen. Das hat auch alles prima geklappt - bis auf folgendes Problem:

Wenn ich den Dialog bewege, wird der Hintergrund nicht erneuert. Konkret heißt das, dass der Text, der unter dem Dialog war, beim Bewegen mitbewegt wird, anstatt dass der neue Text dann halbsichtbar unter der Form liegt. So sieht das Ganze dann aus:

fenster

Ich denke, es ist verständlich, dass das nicht geplant ist. Also brauche ich entweder einen Lösungsvorschlag, oder eine Alternative, bei der dieser Fehler nicht auftritt. Ich möchte hier noch einmal erwähnen, dass ich Delphi 3 verwende. Aber es ist nicht so, dass andere Versionen für mich nicht brauchbar wären, sondern, dass Beispiele für Delphi 3 besser wären.

Danke schonmal für euere Lösungsvorschlage

Grüße,
Yogu
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Yogu am Mo 13.12.10 18:35, insgesamt 1-mal bearbeitet
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Mi 09.01.08 21:06 
Zitat:
... Im DSDT habe ich schon den passenden Weg gefunden ...

Äh, ja ist klar. Durch das nicht malen der Hintergrundes

ausblenden Delphi-Quelltext
1:
2:
Form1.Brush.Style:=bsClear;
  Form1.BorderStyle:=bsNone;


wird der Hintergrund halt nichr gezeichnet und alles was vorher an dieder Stelle zu sehen
war bleibt erhalten. ....


Um ein Fenster Transparent zu machen kannst du Suche im MSDN SETLAYEREDWINDOWATTRIBUTES verwenden.

Vorher musst du dein Fenster aber noch "vorbereiten" um Windows anzuzeigen das das Fenster
"besonders" behandelt werden soll.

ausblenden Delphi-Quelltext
1:
SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) or WS_EX_LAYERED);					

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 09.01.08 21:22 
Danke für die schnelle Antwort, user profile iconturboPASCAL!

user profile iconturboPASCAL hat folgendes geschrieben:
Durch das nicht malen der Hintergrundes wird der Hintergrund halt nichr gezeichnet und alles was vorher an dieder Stelle zu sehen
war bleibt erhalten.

Das habe ich mir auch schon überlegt, aber wie gesagt, fiel mir bis jetzt keine andere Möglichkeit ein.

Als ich deinen Code einfügen wollte, habe ich gleich folgendes Problem bekommen: Delphi 3 erkennt die Konstante WS_EX_LAYERED nicht. Ist diese Konstante in einer bestimmten Unit? Oder ist sie in Delphi 3 gar nicht vorhanden? Es würde sicher auch gehen, wenn du mir einfach den Wert dieser Konstante postest.

Leider gilt das gleiche auch für SetLayeredWindowAttributes - diese Function findet Delphi auch nicht. Wie oben: Spezielle Unit? Oder heißt die in Delphi anders?

Ich fände es wirklich toll, wenn ich das nich hinbekommen könnte. Es sähe wirklich viel professioneller aus, wenn ich Transparenz verwende.
turboPASCAL
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 193
Erhaltene Danke: 1

Win XP / Vischda
D6 PE / D2005 PE
BeitragVerfasst: Mi 09.01.08 21:29 
Achja, wollt ich ja noch dazuschreiben... also:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
const
  WS_EX_LAYERED = $00080000;

  LWA_COLORKEY  = $00000001;
  LWA_ALPHA     = $00000002;


ausblenden Delphi-Quelltext
1:
2:
function SetLayeredWindowAttributes; external 'user32.dll'
  name 'SetLayeredWindowAttributes'; stdcall;

_________________
Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus... :P
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mi 09.01.08 21:40 
Ok, die Funktion hab ich jetzt schonmal. Ich musste die Deklaration aber noch ein bisschen umformen, damit alles klappt:

ausblenden Delphi-Quelltext
1:
2:
3:
function SetLayeredWindowAttributes(const hWnd: HWND; crKey: Integer;
  bAlpha: Byte; dwFlags : Integer): Boolean;
  external 'user32.dll' name 'SetLayeredWindowAttributes';


In der FormCreate rufe ich jetzt folgende beiden Prozeduren auf:

ausblenden Delphi-Quelltext
1:
2:
3:
SetWindowLong(Handle, GWL_EXSTYLE,
  GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, 200, LWA_ALPHA);

Leider kommt eine Acces Violation, aber nicht vom Delphi Debugger, sondern von Windows. Deshalb kann ich auch nicht wirklich debuggen. Wenn ich den Aufruf von SetLayeredWindowAttributes weglasse, dann tut sich gar nichts.

Was hab' ich jetzt schon wieder falsch gemacht? Weißt du immer noch weiter?
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 08.02.08 20:27 
So, um das Thema abzuschließen: Seit ich D7 benutze, habe ich dieses Problem nicht mehr. Da verfügt TForm über entsprechnde Eigenschaften. Leider nur vollständige Transparenz und eine Möglichkeit, das komplette Fenster durchsichtig zu machen. Zwar nicht so ganz, was ich suche, aber damit lässt es sich arbeiten.

Wenn noch jemand weiß, wie ich es so machen könnte, nur her damit:

Ich will den Fensterhintergrund ausblenden, so dass die Komponenten direkt auf das gezeichnet werden, was dahinter liegt. Dann kann ich auch ein transparentes PNG auf das Form stellen, welches dann so eine Halbtransparenz macht.


Zuletzt bearbeitet von Yogu am Fr 08.02.08 22:04, insgesamt 1-mal bearbeitet
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Fr 08.02.08 21:48 
Hab ich was falsch verstanden, oder warum verwendest du AlphaBlendValue nicht? Dann kannst du das Fenster doch halbtransparent machen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 08.02.08 22:03 
user profile iconGTA-Place hat folgendes geschrieben:
Hab ich was falsch verstanden?

Ja. ;)

Ich will schlicht und einfach den (bei Win2K grauen) Hintergrund eines Fensters ausblenden, sodass das, was dahinter ist (z. B. der Desktop) durchscheint. Dann kann ich ein PNG darauf plazieren, welches den Alpha-Kanal verwendet. So kann ich wie Vista auch schönere Fensterrahmen zeichnen.

Mit AlphaBlendValue kann ich nur das gesamte Formular gleich durchscheinend machen. Das ist zwar auch schön, hilft mir bei diesem Problem aber leider nicht weiter. Einite Stellen sollen ja deckend gezeichnet werden.

Aber trotzdem danke, user profile iconGTA-Place.
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 09.02.08 09:05 
Das hatten wir doch schonmal:
Suche in der Entwickler-Ecke HALBTRANSPARENTER FORMHINTERGRUND
Vielleicht klappt die Variante von user profile icondavid-kurz

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
Yogu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: So 10.02.08 18:32 
Hallo,

user profile iconGTA-Place hat folgendes geschrieben:
Vielleicht klappt die Variante von user profile icondavid-kurz

Leider nicht. Das ist ungefähr das gleiche, wie schon user profile iconturboPASCAL hier gepostet hat. user profile iconhuhn wollte ungefähr das gleiche wie ich, eine Lösung gab es aber leider nicht.

Meine Ansprüche sind sogar nicht ganz so hoch: Ich will nicht mal eine Alpha-Funktion haben, sondern den Hintergrund nur komplett ausblenden. Nur die Controls sollen noch sichtbar bleiben.

Falls jetzt jemand meint: "Das ist doch einfach, nehm doch TransparentColor", dann stimmt das nicht so ganz. Ich muss den Formhintergrund wirklich weghaben, nicht nur einfach ausblenden. Sonst klappt das mit transparenten PNGs auch nicht mehr.

Grüße,
Yogu