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



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: