Code archives/Miscellaneous/B3D Screensaver with working preview
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Here is a working Code for the Windows Screensaver Preview. It was originaly Written by MANIAK_dobrii, and was Accessibile through BlitzCoder website. Somehow i have managed to get the sourcecode (just found it on my backup HD), and here it is,for the BB-archive, modified to be startable with only small addition to the Userlib. The needed userlib code is provided in the Sourcecode. | |||||
;Athor: MANIAK_dobrii ;Based at Grisu-s tutorial ;I made it real ;Known Isues: Minimisable, ctr-alt-delABLE, don't sent message to Windows, that screensaver is active ;P.S. There are a lot of different things to do, but that sourse just shows, that you can drow your 3D scene at any window you want ;There will be some updates, i think ;P.P.S. Sorry of my English:) ; ;################################################################################################### ; User32.decls needed for Preview: (this are the working ones !) ;################################################################################################### ;.lib "user32.dll" ; ;api_BeginDeferWindowPos%(nNumWindows%):"BeginDeferWindowPos" ;api_EndDeferWindowPos%(hWinPosInfo%):"EndDeferWindowPos" ;api_GetWindowLong%(hWnd%,nIndex%):"GetWindowLongA" ;api_IsIconic%(window%):"IsIconic" ;api_IsWindow% (hwnd%) : "IsWindow" ;api_SetActiveWindow%(hWnd%):"SetActiveWindow" ;api_SetWindowLong%(hWnd%,nIndex%,dwNewLong%):"SetWindowLongA" ;api_SetParent%(hWndChild%,hWndNewParent%):"SetParent" ;api_ShowCursor% (bShow%) : "ShowCursor" ;api_ShowWindow%(hWnd%,nCmdShow%):"ShowWindow" ; ;APISCR_InvalidateRect%(hWnd%,lpRect%,bErase%):"InvalidateRect" ;APISCR_DeferWindowPos%(hWinPosInfo%,hWnd%,hWndInsertAfter%,x%,y%,cx%,cy%,uFlags%):"DeferWindowPos" ;APISCR_FindWindow%(lpClassName,lpWindowName$):"FindWindowA" ;APISCR_GetClassName%(hWnd%,lpClassName*,nMaxCount%):"GetClassNameA" ;#################################################################################################### ; Kernel32.decls needed for mutex ;#################################################################################################### ; lib kernel32.decls: ; ; CreateMutex%(lpMutexAttributes%,bInitialOwner%,lpName$):"CreateMutexA" ; api_GetLastError% () : "GetLastError" ; api_ReleaseMutex%(Handle%):"ReleaseMutex" ;#################################################################################################### ;Global ScreenX% = 1024 ;Global ScreenY% = 768 ;Global ScreenD% = 32 ;Graphic 0,0,0,1 opens the Graphic screen at the desktop size and Resolution. Global ScreenX% = 0 Global ScreenY% = 0 Global ScreenD% = 0 Const ERROR_ALREADY_EXISTS=183 ;For mutex Global hMutex Const WS_VISIBLE = $10000000 Const WS_CHILD = $40000000 Const GWL_STYLE = (-16) Const SW_SHOW = $5 Const SWP_FRAMECHANGED = $20 Const SWP_SHOWWINDOW = $40 Const SW_HIDE = $0 Const GWL_HINSTANCE = (-6) ChangeDir SystemProperty$("appdir") ; If you have any outside resourses Global curwindow Global hModule Global preview_window% Global timer=MilliSecs() , z=1 ;You can Delete this, as it is used for demo text purpose. If CommandLine$() <> "" Then CL$=Upper(Left$(CommandLine$(),2)) Select True Case cl$="/C" If Mutex("My Saver C")=1 Then Mutex() ;Prevents multiple instances of this Screensaver (but allows config/Preview and Normal start) Configure() ;Configure the screensaver Case CL$="/S" If Mutex("My Saver S")=1 Then Mutex() Start() ;Start the screensaver itself Case CL$="/P" If Mutex("My Saver P")=1 Then Mutex() Preview() ;Render Screensaver in preview window End Select EndIf Mutex() ; Free it End ;The End ;Just render(i use function, instead the body code, 'cos there will be a half-size program(Render() calls twice: in Preview() and Start())) Function Render(previev=1) ;//////////////////////////////////////////////////// If previev=1 Then Cls Color $ff,$ff,$ff txt$="Screensaver with working preview window ..." Local l=6 Local lol$=String(" ",l) If MilliSecs()-timer>250 timer=MilliSecs() z=z+1 : If z=> Len(txt$)+l Then z=1 EndIf txt1$=Mid$(lol$+txt$+lol$,z,l) For y=-1 To 1 For x=-1 To 1 Text 10+x,10+y,txt1$ Next Next Color 0,0,0 Text 10,10,txt1$ Flip If previev=1 Then APISCR_InvalidateRect curwindow,0,True ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ End Function ;Initialises the Screen,settings etc Function CreateEnv(Mode=2) ;Mode 2 (windowed) for preview, Mode 0 (Fullscreen) - Screensaver Graphics ScreenX%,ScreenY%,ScreenD%,Mode ;If Mode=2 Then Graphics ScreenX%,ScreenY%,ScreenD%,3 ;Resizeable window, for fullscreen preview SetBuffer BackBuffer() End Function Function Configure() ;Configuration of your Screensaver goes here. End Function ; Edit the Above functions, no need to edit below ! ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////| ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\| Function Preview() ;The "meat" of the Preview code wnd%=Int(Mid(CommandLine(),3)) BlitzClass$ = GetBlitzWindowClass$() hModule = api_GetWindowLong(curwindow,GWL_HINSTANCE) preview_window% =wnd% CreateEnv() BB_3D_View = GraphicPreview(preview_window%,0,0,152,112,0) ActivateWindow preview_window% While api_IsWindow(preview_window) Delay 1 Render() Wend End Function Function Start() ;Normal Main loop - Fullscreen CreateEnv(1) ; FlushKeys() ;Clear Keys and mouse FlushMouse() MoveMouse 0,0 api_ShowCursor(0) ;Hides the cursor Repeat ;Main Loop Cls Delay 1 Render(0) ;Screensaver code Until GetMouse() <> 0 Or MouseX() <> 0 Or MouseY() <> 0 Or GetKey() <> 0 ;Code to release the images api_ShowCursor(1) ;Show the cursor End Function ;//////////////////////////////////////// ;Sets BB Graphic window onto the window(obj) with x&y coordinates(obj's local) and width&height with style(0 or 1) Function GraphicPreview(obj,x,y,width,height,style=0) ;Set style to 0 or else the saver preview window wont stop, when switching to other screensaver Select style Case 0 Cstyle = WS_VISIBLE Or WS_CHILD Case 1 Cstyle = 0 End Select api_SetWindowLong curwindow,GWL_STYLE,Cstyle api_SetParent curwindow,obj SetWindowPosL(curwindow,x,y,width,height) ActivateWindow(obj) Return curwindow End Function Function ActivateWindow(hWnd) api_ShowWindow(hWnd,SW_SHOW) api_SetActiveWindow(hWnd) End Function Function SetWindowPosL(obj,x,y,width,height) r = api_BeginDeferWindowPos(1); t = APISCR_DeferWindowPos(r,obj,0,x,y,width,height,SWP_FRAMECHANGED Or SWP_SHOWWINDOW); api_EndDeferWindowPos(r); api_ShowWindow(obj,SW_SHOW); api_SetActiveWindow(obj); End Function Function GetBlitzWindowClass$() RUNTIME_Window$ = "MSE"+Rand(10000,99999) AppTitle RUNTIME_Window curwindow = APISCR_FindWindow("",RUNTIME_Window$) api_ShowWindow curwindow,SW_HIDE CLASS_NAME = CreateBank(256) BLITZ_CLASS_NAME_BANK = CreateBank(0) StringLen = APISCR_GetClassName(curwindow,CLASS_NAME,BankSize(CLASS_NAME)) ResizeBank BLITZ_CLASS_NAME_BANK,StringLen CopyBank CLASS_NAME,0,BLITZ_CLASS_NAME_BANK,0,StringLen FreeBank CLASS_NAME BLITZ_CLASS$ = "" For loop = 0 To StringLen - 1 BLITZ_CLASS$ = BLITZ_CLASS$ + Chr(PeekByte(BLITZ_CLASS_NAME_BANK,loop)) Next Return BLITZ_CLASS$ End Function Function Mutex(MutexName$="") ;To set a mutex, enter a name ;call it again without parameters to end the duplicate start! ;Copy following lines at the beginning of your program and uncomment ;Const ERROR_ALREADY_EXISTS=183 ;For mutex ;Global hMutex ;example run: ;If Mutex("My Saver C")=1 Then Mutex() ;Prevents multiple instances If Len(MutexName$)>0 hMutex=CreateMutex(0,1,MutexName$) ; Mutex accessible to any program, change it for other programs If api_GetLastError() = ERROR_ALREADY_EXISTS Then Return 1 Else api_ReleaseMutex(hMutex) End ;To end or not to end ?!? EndIf End Function |
Comments
| ||
Self extracting bb code, contains the Original and modified (by me) screen saver code (7zipped). |
| ||
Hi Dan You use 'ScreenX%=1024', 'ScreenY%=768' and 'ScreenD%=32' without check, if this GfxMode is available.... Use 'Graphics 0,0,0,1' to open Fullscreen in the same Size as the Desktop |
| ||
Use 'Graphics 0,0,0,1' to open Fullscreen in the same Size as the Desktop Wow, I for one have just learned something! |
| ||
Same for me @BlitzSupport. @Sirrus: It takes around 5 seconds to open a screen with it. ;Graphics 1680,1050,32,1 Graphics 0,0,0,1 Print "Hi" WaitKey() I see, Graphic3d is faster here. But nice to know. Added it to the Blitz3d manual. Thanks. |
| ||
I think that is the only way you can get the desktop size in Blitz3D (but it works not in Window-mode) |
| ||
That is the only way without the use of external libraries (decls) as you can see in here: 3 functions Timer_Sec Timer_mSec and Screen - from the screen function. |
Code Archives Forum