PureBasic Screensaver mit Ein- und Ausblendeffekt

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.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

PureBasic Screensaver mit Ein- und Ausblendeffekt

Beitrag von legion »

Hallo !

Hab mal einen Screensaver probiert.

Zu erst eine EXE erstellen und dann die Endung auf SCR umbenennen.
Mit rechter Maustaste anklicken --> installieren oder nach Windows\System32 kopieren
Getestet unter Windows XP SP2 und Windows Vista

Download:PBScreensaver.zip

Lg. Legion

Code: Alles auswählen

Global XPOS.l,YPOS.l
Global EXITSTATUS.b
Global FirstParam.s,Command.s
;-----------------------------------------------------------------------------------------------------------
Procedure PreviewAutoDestruction(window,message,wParam,lParam) 
 Shared WM_DestroyPreview    
 Result = #PB_ProcessPureBasicEvents 
 Select message 
  Case #WM_CLOSE 
   DestroyWindow_(window)
   If IsImage(1): FreeImage(1) : EndIf 
   End 
  Case WM_DestroyPreview 
   If IsImage(1): FreeImage(1) : EndIf
   End 
  EndSelect 
 ProcedureReturn Result 
EndProcedure 
;-----------------------------------------------------------------------------------------------------------
Procedure Preview(preview) 
 CatchImage(1,?VOS)
 UseGadgetList(preview) 
 GetClientRect_(preview,@rc.rect)    
 ImageGadget(1,0,0,0,0,ImageID(1))  
 CloseGadgetList() 
 Shared WM_DestroyPreview 
 WM_DestroyPreview=RegisterWindowMessage_(@"PREVIEW AUTO DESTRUCTION") 
 SendMessage_(#HWND_BROADCAST,WM_DestroyPreview,0,0)          
 SetParent_(OpenWindow(0,0,0,0,0,"CHILD WINDOW",#PB_Window_Invisible),preview)    
 SetWindowCallback(@PreviewAutoDestruction())    
 Repeat 
  WaitWindowEvent() 
 ForEver    
EndProcedure 
;-----------------------------------------------------------------------------------------------------------
Procedure Fadein()
 Protected i
 For i = 0 To 255 Step 5
 ClearScreen(0)
 DisplayTranslucentSprite(1,XPOS,YPOS,i)
 FlipBuffers()
 If EXITSTATUS = 1 : Break : EndIf
 Next i 
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Fadeaut()
 Protected i = 255
 While i > 1
 ClearScreen(0)
 DisplayTranslucentSprite(1,XPOS,YPOS,i)
 FlipBuffers()
 i = i-5
 If EXITSTATUS = 1 : Break : EndIf
 Wend
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure RandomPos(index)
 Repeat
 XPOS = Random(DesktopWidth(0)-ImageWidth(0))
 YPOS = Random(DesktopHeight(0)-ImageHeight(0))
 If EXITSTATUS = 1 : Break : EndIf
 StartSpecialFX()
 Fadein()
 StopSpecialFX()
 If EXITSTATUS = 1 : Break : EndIf
 Delay(4000)
 If EXITSTATUS = 1 : Break : EndIf
 StartSpecialFX()
 Fadeaut()
 StopSpecialFX()
 If EXITSTATUS = 1 : Break : EndIf
 ForEver
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Main()
  If InitSprite() And InitSound() And InitKeyboard() And ExamineDesktops() And InitMouse()And OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"")
  CatchImage(0,?BAK)
  CatchSprite(1,?BAK,#PB_Sprite_Memory)
  StartSpecialFX()
  Thread = CreateThread(@RandomPos(),0)
   If IsThread(Thread)
   Repeat  
    ExamineMouse()
    MouseDeltaX()
    MouseDeltaY()
    If MouseDeltaX() <> 0 Or MouseDeltaY() <> 0
     EXITSTATUS = 1
     WaitThread(Thread)
     Break 
    EndIf
    Delay(1)
   ForEver
 EndIf
 FreeImage(0)
 FreeSprite(1) 
 Else
  MessageRequester("Fehler","Konnte DirectX nicht einwandfrei initialisieren",#PB_MessageRequester_Ok)
 EndIf 
EndProcedure
;-----------------------------------------------------------------------------------------------------------
 FirstParam      = ProgramParameter() 
 Command         = LCase(Left(ReplaceString(FirstParam,"-","/"),2))
 ParentWindow.l  = Val(StringField(FirstParam,2,":")) | Val(ProgramParameter())
 EXITSTATUS      = 0
;----------------------------------------------------------------------------------------------------------- 
 Select Command      
 Case "/p" 
  ;Preview
  Preview(ParentWindow) 
;-----------------------------------------------------------------------------------------------------------
 Case "/c" 
  ;Config
  MessageRequester("Info","Dieser Bildschirmschoner hat keine Optionen, die Sie einstellen können",#PB_MessageRequester_Ok)      
;-----------------------------------------------------------------------------------------------------------
 Default 
  ;Start Screensaver
  Main()
EndSelect 
;-----------------------------------------------------------------------------------------------------------
End
;-----------------------------------------------------------------------------------------------------------
;Nicht vergessen auf eigene Pfade umzustellen ! ! ! ! ! ! ! ! 
DataSection
BAK: IncludeBinary "Logo das eingeblendet wird"
VOS: IncludeBinary "Vorschaubild"
EndDataSection
Zuletzt geändert von legion am 23.03.2008 13:05, insgesamt 1-mal geändert.
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

#EDIT
Hier noch eine andere Version mit AlphaBlend ohne Sprites und ohne Direct-X.

Code: Alles auswählen

Prototype AlphaBlend(DestDC,x1,y1,w1,h1,SourceDC,x2,y2,w2,h2,BF)
Msimg32 = OpenLibrary(#PB_Any, "msimg32.dll")
If Msimg32
 Global AlphaBlend_.AlphaBlend = GetFunction(msimg32, "AlphaBlend")
Else
 MessageRequester("Fehler!","Kann msimg32.dll nicht öffnen !",#MB_ICONERROR)
 Goto EXIT
EndIf  
;-----------------------------------------------------------------------------------------------------------
#AC_SRC_OVER  = 0  ;Die Quelle wird über dem Ziel gezeichnet
#AC_SRC_ALPHA = 1  ;Das Quellbitmap enthält bereits einen Alphawert
;-----------------------------------------------------------------------------------------------------------
Enumeration
  #Window_0
EndEnumeration
;-----------------------------------------------------------------------------------------------------------
Enumeration
  #Image_0
  #Image_1
  #Image_2
EndEnumeration
;-----------------------------------------------------------------------------------------------------------
Global XPOS.l,YPOS.l
Global EXITSTATUS.b
Global FirstParam.s,Command.s
Global *AlphaBlend.l,Kanal.b
;-----------------------------------------------------------------------------------------------------------
Procedure PreviewAutoDestruction(window,message,wParam,lParam) 
 Shared WM_DestroyPreview    
 Result = #PB_ProcessPureBasicEvents 
 Select message 
  Case #WM_CLOSE 
   DestroyWindow_(window)
   If IsImage(1): FreeImage(1) : EndIf 
   End 
  Case WM_DestroyPreview 
   If IsImage(1): FreeImage(1) : EndIf
   End 
  EndSelect 
 ProcedureReturn Result 
EndProcedure 
;-----------------------------------------------------------------------------------------------------------
Procedure Preview(preview) 
 UseGadgetList(preview) 
 GetClientRect_(preview,@rc.rect)    
 ImageGadget(1,0,0,0,0,ImageID(1))  
 CloseGadgetList() 
 Shared WM_DestroyPreview 
 WM_DestroyPreview=RegisterWindowMessage_(@"PREVIEW AUTO DESTRUCTION") 
 SendMessage_(#HWND_BROADCAST,WM_DestroyPreview,0,0)          
 SetParent_(OpenWindow(0,0,0,0,0,"CHILD WINDOW",#PB_Window_Invisible),preview)    
 SetWindowCallback(@PreviewAutoDestruction())    
 Repeat 
  WaitWindowEvent() 
 ForEver    
EndProcedure 
;-----------------------------------------------------------------------------------------------------------
Procedure BlendImages(Image1,Image2,AlphaWert,AlphaFormat)
 Protected BackImageID,NewImageHDC,BF,*BF.BLENDFUNCTION = @BF  
  *BF\BlendOp = #AC_SRC_OVER
  *BF\BlendFlags = 0
  *BF\SourceConstantAlpha = AlphaWert
  *BF\AlphaFormat = AlphaFormat
  WinHDC = GetDC_(WindowID(#Window_0)) : TempDC = CreateCompatibleDC_(WinHDC) 
  BackImageID = CreateImage(#PB_Any,ImageWidth(Image1),ImageHeight(Image1)) 
  NewImageHDC = StartDrawing(ImageOutput(BackImageID))
  SelectObject_(TempDC,ImageID(Image1))
  BitBlt_(NewImageHDC,0,0,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,#SRCCOPY)  
  SelectObject_(TempDC,ImageID(Image2))
  AlphaBlend_(NewImageHDC,0,0,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,ImageWidth(Image2),ImageHeight(Image2),BF)  
  StopDrawing()  
  SelectObject_(TempDC,ImageID(BackImageID))
  BitBlt_(WinHDC,XPOS,YPOS,ImageWidth(Image1),ImageHeight(Image1),TempDC,0,0,#SRCCOPY)
  ReleaseDC_(WindowID(#Window_0),WinHDC) : DeleteDC_(TempDC) : FreeImage(BackImageID)
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Fadein()
 Protected i
 For i = 0 To 255
 BlendImages(#Image_1,#Image_2,i,0)
 Delay(5)
 If EXITSTATUS = 1 : Break : EndIf
 Next i 
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Fadeaut()
 Protected i = 255
 While i > 1
 BlendImages(#Image_1,#Image_2,i,0)
 Delay(5)
 i = i-1
 If EXITSTATUS = 1 : Break : EndIf
 Wend
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure RandomPos(index)
 Repeat
 XPOS = Random(DesktopWidth(0)-ImageWidth(#Image_2))
 YPOS = Random(DesktopHeight(0)-ImageHeight(#Image_2))
 Fadein()
 Delay(3000)
 Fadeaut()
 If EXITSTATUS = 1 : Break : EndIf
 ForEver
EndProcedure
;-----------------------------------------------------------------------------------------------------------
Procedure Main()
Protected x,y
If OpenWindow(#Window_0,0,0,DesktopWidth(DT),DesktopHeight(DT), "Demo",#PB_Window_BorderLess|#PB_Window_Maximize)
  ShowCursor_(0)
  SetWinBackgroundColor(WindowID(#Window_0),0);benötigt PBOSL_SkinWin
  StickyWindow(#Window_0,1)
  x = WindowMouseX(#Window_0)
  y = WindowMouseY(#Window_0)  
  Thread = CreateThread(@RandomPos(),0)
  If IsThread(Thread) 
   Repeat  
    Event = WaitWindowEvent()
    WindowID = EventWindow()
    GadgetID = EventGadget()
    EventType = EventType()
    
    If Event = #WM_KEYDOWN
     EXITSTATUS = 1
     WaitThread(Thread,10)
     Break     
    EndIf
    If WindowMouseX(#Window_0) <> x Or WindowMouseY(#Window_0) <> y
     EXITSTATUS = 1
     WaitThread(Thread,10)
     Break 
    EndIf
   Until Event = #PB_Event_CloseWindow
 EndIf
EndIf  
EndProcedure
;-----------------------------------------------------------------------------------------------------------
 FirstParam      = ProgramParameter() 
 Command         = LCase(Left(ReplaceString(FirstParam,"-","/"),2))
 ParentWindow.l  = Val(StringField(FirstParam,2,":")) | Val(ProgramParameter())
 EXITSTATUS      = 0
 DT              = ExamineDesktops() 
 
 CatchImage(#Image_0,?VOS)
 CatchImage(#Image_1,?BLA)
 CatchImage(#Image_2,?BAK)
;----------------------------------------------------------------------------------------------------------- 
 Select Command      
 Case "/p" 
  ;Preview
  Preview(ParentWindow) 
;-----------------------------------------------------------------------------------------------------------
 Case "/c" 
  ;Config
  MessageRequester("Info","Dieser Bildschirmschoner hat keine Optionen, die Sie einstellen können",#PB_MessageRequester_Ok)      
;-----------------------------------------------------------------------------------------------------------
 Default 
  ;Start Screensaver
  Main()
EndSelect 
;----------------------------------------------------------------------------------------------------------- 
 FreeImage(#Image_0)
 FreeImage(#Image_1)
 FreeImage(#Image_2)
EXIT: 
End
;-----------------------------------------------------------------------------------------------------------
;Nicht vergessen auf eigene Pfade umzustellen ! ! ! ! ! ! ! ! 
DataSection
BAK: IncludeBinary "Logo das eingeblendet werden soll (24Bit BMP)"
VOS: IncludeBinary "Vorschaubild für Windows 152x112 Pixel (24Bit BMP)"
BLA: IncludeBinary "Hintergrundbild schwarz mit gleicher Grösse wie Logo (24Bit BMP)"
EndDataSection
Zuletzt geändert von legion am 23.03.2008 13:07, insgesamt 2-mal geändert.
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

legion,benutze Prototypes für die Msimg32.dll
http://www.purebasic.fr/english/viewtop ... 323#214323

Der Bug ist schon ewig bekannt.
http://www.purebasic.fr/english/viewtopic.php?t=29519
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag von legion »

SoS hat geschrieben:Der Bug ist schon ewig bekannt.
http://www.purebasic.fr/english/viewtopic.php?t=29519
Da geht es doch um "TransparentBlt" und nicht um "AlphaBlend" !

Trotzdem danke für den Tipp ! :wink:

Lg. Legion
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Antworten