Desktop zu Blitz Basic Image und in Window zeigen !!! von Markus |
Hiermit könnt ihr den Desktop Hintergrund in ein Image übertragen und damit z.B. ein Screensaver bauen . Habe mal einen Würfel in 3D eingebaut der sich aufdemDesktop dreht 8) Dazu werden zwei Userlibs benötigt siehe Ende ! Wenn jemand das opengl Beispiel hat diese Userlibs ergänzen , sonnst einfach selber machen . Die Semikolons natürlich entfernen :idea: [code:1:69ac651e65] ; Blitz Basic 3D Example to get the desktop in blitz image and window :-) ; You can make a screensaver with it ;-) ; MR 18.03.2003 ;--------------------------------------------------------------------------- automatik Blitz window on start ;your Desktop width x height Const dwidth =1600 Const dheight=1200 ;your Blitz Window Const swidth =800 Const sheight=600 ;to find the Window AppTitle "BlitzSaver" ;--------------------------------------------------------------------------- find Blitz Start Window Handle and HIDE it ! Global bhWnd=FindBlitzWindow("BlitzSaver") ;ShowWindow commands Const SW_HIDE = 0 Const SW_SHOW = 5 ShowWindow bhwnd,SW_HIDE ;--------------------------------------------------------------------------- copy desktop to bank Global ddc=DesktopDC() Global dbank=CreateBank(swidth*sheight*4) Local x,y,c Local fx,fy fx=dwidth /swidth fy=dheight/sheight For x=0 To swidth-1 For y=0 To sheight-1 c=GetPixel(ddc,x*fx,y*fx) PokeInt dbank,(x*4)+(swidth*y*4),c Next Next ReleaseDC 0,ddc ;--------------------------------------------------------------------------- Show Start Blitz Window ! ShowWindow bhwnd,SW_SHOW ;--------------------------------------------------------------------------- Make the real Blitz Window :-) Graphics3D swidth,sheight,16,1 ;<- note it is 3D but you can also use simple 2D SetBuffer BackBuffer() Global cam=CreateCamera() CameraClsMode cam,False,True MoveEntity cam,0,0,-25 Global cube=CreateCube() EntityColor cube,0,255,0 ScaleMesh cube,0.5,0.5,0.5 ScaleMesh cube,10,10,10 EntityAlpha cube,0.5 AmbientLight 16,16,16 Global light=CreateLight() LightRange light,50 MoveEntity light,-25,25,-50 PointEntity light,cube ;--------------------------------------------------------------------------- Copy bank to image Global imgDesktop=CreateImage(swidth,sheight) LockBuffer ImageBuffer(imgDesktop) For x=0 To ImageWidth(imgDesktop)-1 For y=0 To ImageHeight(imgDesktop)-1 c=PeekInt(dbank,(x*4)+(swidth*y*4)) Color 0,0,c WritePixelFast x,y,ARGB(ColorBlue(),ColorGreen(),ColorRed()),ImageBuffer(imgDesktop) Next Next UnlockBuffer ImageBuffer(imgDesktop) ;###################################################################### FlushKeys FlushMouse Local ti# While Not KeyHit(1) ti=MilliSecs() DrawBlock imgDesktop,0,0 TurnEntity cube,-1,1,0 RenderWorld ;50 FPS = each frame need 20 ms = (1/50)*1000 = 0.02 sec While Abs(MilliSecs()-ti)<20.0 Wend Flip Wend FlushKeys FlushMouse End ;###################################################################### Function FindBlitzWindow(title$) ;MR 18.03.2003 ;API Call ;not testet for Blitz2D+ ! Local hWnd=FindWindow("Blitz Runtime Class",title$) Return hWnd End Function ;###################################################################### Function DesktopDC() ;MR 18.03.2003 ;API Call Local dc=GetDC(0) Return dc End Function ;###################################################################### Function ARGB(r,g,b) ;Return ((128 * $1000000) Or (r * $10000) Or (g * $100) Or b) Return ((r * $10000) Or (g * $100) Or b) End Function ;###################################################################### USERLIB ;put this once in ..userlibsuser32.decls ;.lib "user32.dll" ;FindWindow%( class$,Text$ ):"FindWindowA" ;GetDC%(hWnd% ):"GetDC" ;ReleaseDC (hWnd%,hDC%):"ReleaseDC" ;ShowWindow%(hWnd%,nCmdShow%):"ShowWindow" ;put this once in ..userlibsGdi32.decls ;.lib "Gdi32.dll" ;GetPixel%(hdc%,X%,Y%):"GetPixel" ;add on user libs restart blitz ide ! ;###################################################################### [/code:1:69ac651e65] |
von ??? |
Hi! Toll! hatte ich auch schon versucht, aber es gab immer probs mit den Banks beim peeken... damit man die Auflösung nicht schon vorher wissen muss, hier noch die Erweiterung zur Lib: [quote:5444bb47bd] .lib "user32.dll" FindWindow%( class$,Text$ ):"FindWindowA" GetDesktopWindow%():"GetDesktopWindow" GetDC%(hWnd% ):"GetDC" ReleaseDC (hWnd%,hDC%):"ReleaseDC" ShowWindow%(hWnd%,nCmdShow%):"ShowWindow" .lib "Gdi32.dll" GetDeviceCaps%(hDC%,nIndex%):"GetDeviceCaps" GetPixel%(hdc%,X%,Y%):"GetPixel" [/quote:5444bb47bd] und um die auflösung abzufragen das hier: [code:1:5444bb47bd] Desk_hWnd = GetDesktopWindow() Desk_DC = GetDC(Desk_hWnd) ScreenWidth = GetDeviceCaps(Desk_DC,8) ScreenHeight = GetDeviceCaps(Desk_DC,10) ScreenDepth = GetDeviceCaps(Desk_DC,12) [/code:1:5444bb47bd] dadurch lassen sich echt tolle effekte machen. wie z.B. dieses Startmenü bei 3DMark das eingeblendet wird. aber vieleicht das ganze nach DLL-Archiv verschieben ... mfg olli |
von ??? |
grmpf... dann gehen in bb3d doch libs... (ich fühl mich so hilflos als bb2d und b+ user ohne 3d :cry: :) ) ich hab nur demo. kannst du das ding mal zu nem screenserver kompilieren, ich mag solche einfachen screensaver. fürn screensaver hab ich noch ne idee: Kannst du es vielleicht so machen das der würfel sich auch auf dem bildschirm bewegt und sich nicht nur dreht, sonder auch durch die welt bewegt? |
von ??? |
[quote:9799615a62="Freax"]Hi! Toll! hatte ich auch schon versucht, aber es gab immer probs mit den Banks beim peeken... damit man die Auflösung nicht schon vorher wissen muss, hier noch die Erweiterung zur Lib ... [/quote:9799615a62] Jo , tolle Idea , mit dem Peeken hatte ich mich auch erst vertan , hatte vergessen den Offset in Bytes umzurechnen und mit *4 für Integer zu multiplizieren :oops: Und die Bank für die Auflösung x*y*4 :idea: Dieses Startfenster ist echt doof , und ohne Fenster kann man kein Image erzeugen *GRRR* Darum erst zur Bank und dann zum Image ... Aber es geht ... jetzt kann ich mein Smiley Screensaver basteln für die Arbeit . Sieht bestimmt witzig aus wenn die über ein großes VB6 Projekt rumschwirren *HEHE* Oder Fake Virus mäßig :twisted: |
von ??? |
wie hast du das gemacht?? hab ja b+ wie kann ich das in b+ machen? ich mach einen screen vom desktop, geht in b+ einfach. Soll ich dann direkt auf den desktop malen oder soll ich noch einen buffer nehmen? also entweder: screen vom desktop desktop bild auf desktop malen bilder malen Oder: creen vom desktop canvas machen desktop img malen bilder malen canvas flipen Was ist besser??? |
von ??? |
[quote:5f133319ef="Niclas"]grmpf... ...ich hab nur demo. kannst du das ding mal zu nem screenserver kompilieren, ich mag solche einfachen screensaver. fürn screensaver hab ich noch ne idee: Kannst du es vielleicht so machen das der würfel sich auch auf dem bildschirm bewegt und sich nicht nur dreht, sonder auch durch die welt bewegt?[/quote:5f133319ef] Mal gucken wie ich Zeit habe ... Schick mir am besten mal ne Mail das ich das nicht vergesse ;-) |
von ??? |
[quote:485d4779e0="Niclas"]wie hast du das gemacht?? hab ja b+ wie kann ich das in b+ machen? ich mach einen screen vom desktop, geht in b+ einfach. Soll ich dann direkt auf den desktop malen oder soll ich noch einen buffer nehmen?[/quote:485d4779e0] So sollte es in Blitz+ gehen , hab ich aus dem echten Blitz Forum . Mit dem Bild kannst du dann machen was du willst . Also z.B. mit DrawBlock img,x,y ins Fenster malen etc. [code:1:485d4779e0] imgdt=CreateImage(ClientWidth(Desktop()),ClientHeight Desktop())) SetBuffer DesktopBuffer() GrabImage imgdt,0,0 [/code:1:485d4779e0] |
von ??? |
[quote:72aa812969="Niclas"]wie hast du das gemacht?? hab ja b+ wie kann ich das in b+ machen? ich mach einen screen vom desktop, geht in b+ einfach. Soll ich dann direkt auf den desktop malen oder soll ich noch einen buffer nehmen? also entweder: screen vom desktop desktop bild auf desktop malen bilder malen Oder: creen vom desktop canvas machen desktop img malen bilder malen canvas flipen Was ist besser???[/quote:72aa812969] Hab leider kein Blitz+ Für nen Screensaver immer Vollbild und mit Buffer arbeiten . Also malen , Flip , malen , Flip ... In Blitz2D also so Graphics 640,480,16,1 Setbuffer Backbuffer() while not keyhit(1) Drawblock ... delay 20 oder siehe in mein example flip wend end |
von ??? |
das war für mich auch nicht das prob, aber ich nehm lieber noch einen canvas buffer weil wenn das programm dann plötzlich abstürtzt und ich hab keinen buffer da ich dann direkt auf den desktop male dann bleibt alles da :D |
von ??? |
[quote:f40c791c1e="Niclas"]das war für mich auch nicht das prob, aber ich nehm lieber noch einen canvas buffer weil wenn das programm dann plötzlich abstürtzt und ich hab keinen buffer da ich dann direkt auf den desktop male dann bleibt alles da :D[/quote:f40c791c1e] Dafür gibt es aber auch den Debug Modus . Wenn das Programm abkackt müßte aber auch so der Desktop wieder erscheinen wenn man das Programm für Vollbild macht . Kann leider auch sein das man kein Vollbild Fenster mit Blitz mehr öffnen kann weil es nicht freigegeben wurde ... |
von ??? |
aber ich will dieses dumme fenster davor nicht haben was b+ zum glück net hat :P dann kann ich ohne graphics so auf den desktop malen nur da der desktop nicht immer komplett aktualisiert wird sondern ja nur wenn man auf ein icon kommt oder so würden die smylies (oder was auch immer) bleiben dann kleben bis da ein fenster drüber war oder so... |
von ??? |
Wow geil! Das nenne ich mal praktisch! Gute Arbeit :D |
von ??? |
Bei den Constanten für Screen Beite/Höhe bitte mal noch ein # dran hängen und bei fx#,fy# auch ... dann geht auch die scalierung richtig ... |
von ??? |
Hi! Hier noch schnell ein Effekt wie aus 3DMark 2001 SE: (geht auch mit Blitz2D) [code:1:2c8128c610] Screen = GetScreen() Graphics ScreenWidth(),ScreenHeight(),32,1 SetBuffer BackBuffer() ScreenImg = GetImage(Screen) : FreeBank Screen Logo = LoadImage("Logo.jpg") X = ScreenWidth() / 2 Y = ScreenHeight() / 2 MidHandle Logo While Not KeyDown(1) Cls DrawBlock ScreenImg,0,0 AlphaImage(Logo,X,Y,Alpha#) FPS = 1000 / (MilliSecs() - Old_MS) Old_MS = MilliSecs() Alpha# = Alpha# + (1.5 / (FPS / 15.0)) If Alpha# > 100.0 Then Alpha# = 0.0 Flip Wend FreeImage Img : FreeImage Logo : End Function GetScreen() Local hWnd = GetActiveWindow() Local DC = GetDC(0) Local Width = ScreenWidth() Local Height = ScreenHeight() Local Bank = CreateBank(Width * Height * 4) Local X,Y,R,G,B,RGB,Count ShowWindow hWnd,0 For X = 0 To Width - 1 For Y = 0 To Height - 1 RGB = GetPixel(DC,X,Y) R = (RGB Shr 16) And $FF G = (RGB Shr 8) And $FF B = (RGB And $FF) RGB = B * $10000 + G * $100 + R PokeInt Bank,Count,RGB Count = Count + 4 Next Next ShowWindow hWnd,5 Return Bank End Function Function GetImage(Bank) Local Width = ScreenWidth() Local Height = ScreenHeight() Local Image = CreateImage(Width,Height) Local OldBuffer = GraphicsBuffer() Local Count SetBuffer ImageBuffer(Image) LockBuffer() For X = 0 To Width - 1 For Y = 0 To Height - 1 WritePixelFast X,Y,PeekInt(Bank,Count) Count = Count + 4 Next Next UnlockBuffer() SetBuffer OldBuffer Return Image End Function Function ScreenWidth() Return GetDeviceCaps(GetDC(0),8) End Function Function ScreenHeight() Return GetDeviceCaps(GetDC(0),10) End Function Function AlphaImage(Image,XPos,YPos,Percent#) Local X,Y,RGB1,R1,G1,B1,RGB2,R2,G2,B2 Local R,G,B,RGB Local XM = ImageXHandle(Image) Local YM = ImageYHandle(Image) Local Width = ImageWidth(Image) - 1 Local Height = ImageHeight(Image) - 1 Local Buffer1 = GraphicsBuffer() Local Buffer2 = ImageBuffer(Image) LockBuffer Buffer1 LockBuffer Buffer2 For X = 0 To Width For Y = 0 To Height RGB1 = ReadPixelFast(X + XPos - XM,Y + YPos - YM,Buffer1) RGB2 = ReadPixelFast(X,Y,Buffer2) R1 = (RGB1 Shr 16) And $FF G1 = (RGB1 Shr 8) And $FF B1 = (RGB1 And $FF) R2 = (RGB2 Shr 16) And $FF G2 = (RGB2 Shr 8) And $FF B2 = (RGB2 And $FF) R = R1 + (Percent# * (R2 - R1) / 100.0) G = G1 + (Percent# * (G2 - G1) / 100.0) B = B1 + (Percent# * (B2 - B1) / 100.0) RGB = R * $10000 + G * $100 + B WritePixelFast X + XPos - XM,Y + YPos - YM,RGB,Buffer1 Next Next UnlockBuffer Buffer2 UnlockBuffer Buffer1 End Function [/code:1:2c8128c610] und Screen.decls: [quote:2c8128c610] .lib "user32.dll" GetActiveWindow%() : "GetActiveWindow" GetDC%(hWnd% ) : "GetDC" ShowWindow%(hWnd%,nCmdShow%) : "ShowWindow" .lib "Gdi32.dll" GetDeviceCaps%(hDC%,nIndex%) : "GetDeviceCaps" GetPixel%(hdc%,X%,Y%) : "GetPixel" [/quote:2c8128c610] Edit: Hier das ganze nochmal so, das man nicht das komplette Bild in der aktuellen Auflösung zeichnen muss: [code:1:2c8128c610] Const LogoWidth = 380,LogoHeight = 180 XPos = (ScreenWidth() - LogoWidth) / 2 YPos = (ScreenHeight() - LogoHeight) / 2 Screen = GetScreen(XPos,YPos,LogoWidth,LogoHeight) Graphics LogoWidth,LogoHeight,32,2 SetBuffer BackBuffer() Result = CreateRectRgn(3,22,LogoWidth + 3,LogoHeight + 22) SetWindowRgn GetActiveWindow(),Result,1 SetWindowPos(GetActiveWindow(),-1,0,0,0,0,3) ScreenImg = GetImage(Screen) : FreeBank Screen Logo = LoadImage("Logo.jpg") While Not KeyDown(1) Cls DrawBlock ScreenImg,0,0 AlphaImage(Logo,0,0,0,Alpha#) FPS = 1000 / (MilliSecs() - Old_MS) Old_MS = MilliSecs() Alpha# = Alpha# + (1.5 / (FPS / 15.0)) If Alpha# > 100.0 Then Alpha# = 0.0 Flip Wend FreeImage Img : FreeImage Logo : End Function GetScreen(XPos,YPos,Width,Height) Local hWnd = GetActiveWindow() Local DC = GetDC(0) Local Bank = CreateBank(Width * Height * 4 + 4) Local X,Y,R,G,B,RGB PokeShort Bank,0,Width PokeShort Bank,2,Height DebugLog WIdth + " " + height ShowWindow hWnd,0 For X = XPos To XPos + Width - 1 For Y = YPos To YPos + Height - 1 RGB = GetPixel(DC,X,Y) R = (RGB Shr 16) And $FF G = (RGB Shr 8) And $FF B = (RGB And $FF) RGB = B * $10000 + G * $100 + R PokeInt Bank,((X - XPos) + (Y - YPos) * Width) * 4 + 4,RGB Next Next ShowWindow hWnd,5 Return Bank End Function Function GetImage(Bank) Local Width = PeekShort(Bank,0) Local Height = PeekShort(Bank,2) Local Image = CreateImage(Width,Height) Local OldBuffer = GraphicsBuffer() Local Count SetBuffer ImageBuffer(Image) LockBuffer() For X = 0 To Width - 1 For Y = 0 To Height - 1 WritePixelFast X,Y,PeekInt(Bank,(X + Y * Width) * 4 + 4) Count = Count + 4 Next Next UnlockBuffer() SetBuffer OldBuffer Return Image End Function Function ScreenWidth() Return GetDeviceCaps(GetDC(0),8) End Function Function ScreenHeight() Return GetDeviceCaps(GetDC(0),10) End Function Function AlphaImage(Image,XPos,YPos,Frame = 0,Percent# = 50) Local X,Y,RGB1,R1,G1,B1,RGB2,R2,G2,B2 Local R,G,B,RGB Local XM = ImageXHandle(Image) Local YM = ImageYHandle(Image) Local Width = ImageWidth(Image) - 1 Local Height = ImageHeight(Image) - 1 Local Buffer1 = GraphicsBuffer() Local Buffer2 = ImageBuffer(Image,Farme) LockBuffer Buffer1 LockBuffer Buffer2 For X = 0 To Width For Y = 0 To Height RGB1 = ReadPixelFast(X + XPos - XM,Y + YPos - YM,Buffer1) RGB2 = ReadPixelFast(X,Y,Buffer2) R1 = (RGB1 Shr 16) And $FF G1 = (RGB1 Shr 8) And $FF B1 = (RGB1 And $FF) R2 = (RGB2 Shr 16) And $FF G2 = (RGB2 Shr 8) And $FF B2 = (RGB2 And $FF) R = R1 + (Percent# * (R2 - R1) / 100.0) G = G1 + (Percent# * (G2 - G1) / 100.0) B = B1 + (Percent# * (B2 - B1) / 100.0) RGB = R * $10000 + G * $100 + B WritePixelFast X + XPos - XM,Y + YPos - YM,RGB,Buffer1 Next Next UnlockBuffer Buffer2 UnlockBuffer Buffer1 End Function [/code:1:2c8128c610] und Screen.decls: [quote:2c8128c610] .lib "user32.dll" GetActiveWindow%() : "GetActiveWindow" GetDC%(hWnd% ) : "GetDC" ShowWindow%(hWnd%,nCmdShow%) : "ShowWindow" SetWindowRgn(hWnd,hRgn,bRedraw) : "SetWindowRgn" SetWindowPos%(hWnd,hWndInsertAfter,x,y,cx,cy,wFlags) : "SetWindowPos" .lib "Gdi32.dll" GetDeviceCaps%(hDC%,nIndex%) : "GetDeviceCaps" GetPixel%(hdc%,X%,Y%) : "GetPixel" CreateRectRgn%(X1,Y1,X2,Y2) : "CreateRectRgn" [/quote:2c8128c610] Sorry aber ist schon cool mit dem ScreenShot mfg olli |