Seite 1 von 3

Schöne Fensteranimation mit Transparenz

Verfasst: 29.01.2008 16:38
von AND51
Hallo!

Habe gerade einen alten Code kompiliert, der sehr groß ist (2225 Zeilen, 68,2 KB) um mit Genugtuung festzustellen, dass der neue Compiler wirklich spürbar schneller ist, als der alte.

Dabei sprang mir diese Prozedur ins Auge, die ich einfach mal mit euch teilen wollte.

Die Prozedur muss als Thread aufgerufen werden und blendet langsam das Fenster aus, sobald es von der Maus verlassen wird. Wenn die Maus das Fenster wieder betritt, wird das Fenster wieder langsam sichtbar.
Die Schnelligkeit, mit der das Fenster ein- und ausgeblendet wird, könnt ihr selber anpassen, entweder das Delay() verkleinern und/oder die Schrittwerte erhöhen (empfohlen).
Pro Fenster 1 Thread, wenn ihr also mehrere Fenster animieren wollt.
Funktioniert ab Windows 2000 und höher (Windows only), die Prozedur beendet sich selbst automatisch, wenn Windows 9x verwendet wird, beendet sich die Prozedur automatisch.

Code: Alles auswählen

Macro TransparentesFenster(Window, Sichtbarkeit=255)
	SetWindowLong_(WindowID(Window), #GWL_EXSTYLE, GetWindowLong_(WindowID(Window),#GWL_EXSTYLE)|#WS_EX_LAYERED)
	SetLayeredWindowAttributes_(WindowID(Window), 0, Sichtbarkeit, #LWA_ALPHA)
EndMacro
Procedure TransparenzAnimation(WindowID)
	Protected n, opacity=255
	If OSVersion() < #PB_OS_Windows_2000
		ProcedureReturn
	EndIf
	While IsWindow(WindowID)
		If WindowMouseX(WindowID) <> -1 And WindowMouseY(WindowID) <> -1 And GetForegroundWindow_() = WindowID(WindowID)
			If opacity < 255
				opacity+16
				If opacity > 255
					opacity=255
				EndIf
				TransparentesFenster(WindowID, opacity)
				Delay(35)
			EndIf
			Continue
		Else
			If opacity > 118
				opacity-16
				If opacity < 1
					opacity=1
				EndIf
				TransparentesFenster(WindowID, opacity)
				Delay(35)
			EndIf
			Continue
		EndIf
		Delay(500)
	Wend
EndProcedure

OpenWindow(0, 0, 0, 640, 480, "AND51 - Bitte Maus in und aus dem Fenster schieben!")
CreateThread(@TransparenzAnimation(), 0) 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
P.S.: Meine Freundin 'Miranda' hat mich zu diesem Effekt inspiriert.

Verfasst: 29.01.2008 19:30
von marco2007
gefällt mir :allright:

...und bringt mich auf eine Idee für mein Programm, bei welchen sich 2 Fenster aus Platzgründen im Weg stehen.

Nur eins verstehe ich nicht: Wie kann man von einer Freundin zu einem transparenten Fenster inspiriert werden?

Verfasst: 29.01.2008 19:36
von PMTheQuick
:allright: Läuft auch perfekt auf Vista! (Vista Ultimate 32bit Deutsch um genau zu sein :D )
Auch mein Avatar findets toll xD

Gruss
PMTheQuick ;)

Verfasst: 29.01.2008 19:37
von Ja!
Sehr schön!

Aber in der Titelleiste wird die Maus noch nicht erkannt.
Das kann aber jeder selbst anpassen (der die WAPI kennt)


Gruß
Udo

Verfasst: 29.01.2008 20:03
von DarkDragon
Nette Spielerei.
marco2006 hat geschrieben:Nur eins verstehe ich nicht: Wie kann man von einer Freundin zu einem transparenten Fenster inspiriert werden?
http://miranda-im.de/mediawiki/index.ph ... Hauptseite

Verfasst: 29.01.2008 20:10
von AND51
> und bringt mich auf eine Idee für mein Programm, bei welchen sich 2 Fenster aus Platzgründen im Weg stehen
Ja, ich habe diesen Effekt entwickelt, weil ich es sonst immer doof fand, das Fenster dahinter anzuklicken, nur um darin eben was zu lesen. Dann muss man immer wieder das Fenster anklicken, um darin weiterzuarbeiten.
So braucht man eben nur die Maus aus und in das Fenster zu gehen.

> Wie kann man von einer Freundin zu einem transparenten Fenster inspiriert werden?
Naja, genau genommen ist Miranda nicht meine Freundin, sondern mein Chatprogramm... Find den Namen nur so toll... Wenn ich sauer bin, nenne ich sie 'Veranda'... :freak: Musst ihr nicht verstehen...

> Läuft auch perfekt auf Vista!
Vielen Dank für das Feedback! Habe es nur unter XP entwickelt.
Sehr schön zu hören, dass es auch unter Vista funkt! :D

> Aber in der Titelleiste wird die Maus noch nicht erkannt
Ja, weil ich nur reine PB Befehle benutze, die WindowMouse-Befehle ermöglichen nur eine Erkennung innerhlab des Fensters (da gehört der Fensterrrahmen oder die Titelleiste nicht zu).

> Das kann aber jeder selbst anpassen (der die WAPI kennt)
Du bist herzlich eingeladen, deine Version zu posten, wenn du magst <)

Re: Schöne Fensteranimation mit Transparenz

Verfasst: 29.01.2008 21:19
von RSBasic
AND51 hat geschrieben:Habe gerade einen alten Code kompiliert, der sehr groß ist (2225 Zeilen, ...
2225? Wenn du das schon "sehr groß" findest, naja :freak: Eher normal/Standard (bei mir jedenfalls)

Aber ansonsten find ich dein Code gut.

Verfasst: 29.01.2008 21:30
von marco2007
Das einzige, was mir aufgefallen ist, daß die CPU auf 100% knallt ->
Ein delay nach if und eins nach else wirkt wie ein Wunder (zumindest bei mir).

Code: Alles auswählen

If WindowMouseX(WindowID) <> -1 And WindowMouseY(WindowID) <> -1 And GetForegroundWindow_() = WindowID(WindowID) 
         Delay(16)

....
Else 
      Delay(16)
         If opacity > 118


lg
Marco

Verfasst: 29.01.2008 22:59
von AND51
> 2225? Wenn du das schon "sehr groß" findest
Das tut ja nichts zur Sache. War einer meiner ersten Codes, dafür find ich 2225 Zeilen viel.

> Das einzige, was mir aufgefallen ist, daß die CPU auf 100% knallt
Soetwas habe ich nicht bemerkt. Gut, ass du das ansprichst! Dachte, das Delay(35) reicht. Bei mir läuft alles flüssig.

Verfasst: 29.01.2008 23:15
von HeX0R
Durch deine beiden falsch gesetzten Continues, wird das Delay(500) nie aufgerufen, das dürfte das Problem sein.