Schöne Fensteranimation mit Transparenz

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Ich habe 2 Programme mit über 5000 Zeilen -> Bin mir aber sicher einige von Euch würden wahrscheinlich nur 4000 oder noch weniger brauchen....Man merkt leider erst oft am Ende eines Programms, daß man einiges wirtschaftlicher hätte machen können...naja, da fehlt mir einfach die Routine...
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@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.
Na wenn das einer deiner ersten Codes waren, dann ist ja jut
Meine erste Anwendung (MWXP-Speed), die ich mit PB 3.30 (Jahr 2004) programmiert habe, hatte schon 2101 Zeilen, naja 124 Zeilen weniger als deiner :mrgreen:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Beitrag von rolaf »

Netter Effekt, aber ist Miranda nicht ne Brause? :lol:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Es reicht sogar nur ein Delay:

Code: Alles auswählen

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)
      EndIf
    Else
      If opacity > 118
        opacity-16
        If opacity < 1
          opacity=1
        EndIf
        TransparentesFenster(WindowID, opacity)
      EndIf
    EndIf
    Delay(1)
  Wend
EndProcedure
Die 'Continue's bringen nichts, weil danach sowieso direkt 'Wend' kommt.
Dann ein 'Delay(1)' vor das 'Wend' und gut ist. :allright:
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Die 'Continue's bringen nichts, weil danach sowieso direkt 'Wend' kommt.
Ja, da hatte ich nen Denkfehler. Ich dachte, wenn weder der If- noch der Else-Teil ausgeführt wird, dann würde das Continue ausgelassen und das Delay(500) ausgeführt, um die CPU nicht so stark auszulasten.
Werde das noch korrigieren.

> Netter Effekt, aber ist Miranda nicht ne Brause?
Ahoi !? :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Perfekt wäre es, wenn ein Rechteck (4 Linien) sichtbar bleiben würde, wenn das Fenster komplett unsichtbar ist. Ich habe leider keine Ahnung, wie man so etwas machen könnte...Ich hab`s mal mit Desktopoutput probiert (Quelle: CodeArchiv: DesktopPainter)...naja...

Code: Alles auswählen

Global Mem.l  
Mem = AllocateMemory(1024)  
 
Procedure.l DesktopOutput()  
  PokeL(Mem, 1)  
  ProcedureReturn Mem  
EndProcedure

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) 
      EndIf 
    Else 
      If opacity > 10 
        opacity-16 
        If opacity < 1 
          opacity=1 
          If StartDrawing(desktopoutput())
            Line(WindowX(windowid), WindowY(WindowID), WindowWidth(windowid), 0, RGB(0,0,0))
            Line(WindowX(windowid), WindowY(WindowID), 0, WindowHeight(windowid), RGB(0,0,0))
            Line(WindowX(windowid)+WindowWidth(windowid), WindowY(WindowID), 0, WindowHeight(windowid), RGB(0,0,0))
            Line(WindowX(windowid), WindowY(WindowID)+WindowHeight(windowid), WindowWidth(windowid), 0, RGB(0,0,0))
          StopDrawing()
          EndIf  
        EndIf 
        TransparentesFenster(WindowID, opacity) 
      EndIf 
    EndIf 
    Delay(1) 
  Wend 
EndProcedure

OpenWindow(0, 60, 60, 640, 480, "AND51 - Bitte Maus in und aus dem Fenster schieben!") 
CreateThread(@TransparenzAnimation(), 0) 
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
 
Die Linien sollten natürlich anschließend wieder unsichtbar werden...

Hat jemand eine Idee?

lg
Marco
Windows 11 - PB 6.03 x64
_________________________________
TomTom
Beiträge: 130
Registriert: 18.10.2006 18:47

Beitrag von TomTom »

cool!

kann man den effect auch auf fremde fenster übergeben?
wenn ja, wie kann ich dort einbauen, dass jedes fenster durchsichtig wird?

MFG tomtom
Pure Basic 4.0
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Falo hat geschrieben:Netter Effekt, aber ist Miranda nicht ne Brause? :lol:
Ich glaube Du meinst Mirinda :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Irgendwie sieht das Rechteck etwas zu klein aus (vielleicht liegt es auch an Windows Aero) und sind nur sehr kurz sichtbar. Vielleicht die Delays vergrößern oder so... aber damit habe ich leider keine Ahnung
:roll:
Benutzeravatar
dige
Beiträge: 1241
Registriert: 08.09.2004 08:53

Beitrag von dige »

Ja, es ist zu klein, da ja nur das Klientfenster ermittelt wird, aber nicht der Fensterrahmen inkl. Titelbar.
Die API GetWindowRect_() ermittelt die kompletten Koordinaten..
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten