Page 3 sur 3

Re: Des bulles dans le bureau

Publié : lun. 05/oct./2009 17:49
par Le Soldat Inconnu
Pigé, tu fais comme mon calcul mais en passant via les fonctions de PB sur les images.

En gros, on fait la même chose mais pas avec la même méthode de calcul

Coté vitesse, sensiblement identique (un poil mieux pour ma version)
Mais j'adopte ton idée de calcul qui est plus propre

Code : Tout sélectionner

    ; PureBasic 4.40
		
    UsePNGImageDecoder()
		
    Procedure SetLayeredWindow2(WindowID) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
			SetWindowLong_(WindowID, #GWL_EXSTYLE, GetWindowLong_(WindowID, #GWL_EXSTYLE) | #WS_EX_LAYERED) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
		EndProcedure
    Procedure AlphaImageWindow2(WindowID, ImageID, Calcul.l) ; Mettre une image PNG comme fond d'une fenêtre
      Protected Image_HDC, Image_Bitmap.BITMAP, Image_BitmapInfo.BITMAPINFO, ContextOffset.POINT, Blend.BLENDFUNCTION
			
			; Dimension de l'image
			GetObject_(ImageID, SizeOf(BITMAP), @Image_Bitmap)
			
			Image = CreateImage(#PB_Any, Image_Bitmap\bmWidth, Image_Bitmap\bmHeight, 32)
			StartDrawing(ImageOutput(Image))
				DrawingMode(#PB_2DDrawing_AlphaBlend)
				DrawAlphaImage(ImageID, 0, 0)
				DrawingMode(#PB_2DDrawing_AlphaChannel)
				DrawAlphaImage(ImageID, 0, 0)
			StopDrawing()
			
			; Chargement du HDC
			Image_HDC = CreateCompatibleDC_(#NULL)
      Image_Ancienne = SelectObject_(Image_HDC, ImageID(Image))
						
			; L'image est mise en skin de la fenêtre
			Blend\SourceConstantAlpha = 255 ; niveau de transparence
			Blend\AlphaFormat = 1 ; Support de la couche alpha
			Blend\BlendOp = 0
			Blend\BlendFlags = 0
			UpdateLayeredWindow_(WindowID, 0, 0, @Image_Bitmap + 4, Image_HDC, @ContextOffset, 0, @Blend, 2)
			
			; Fermeture du HDC
			SelectObject_(Image_HDC, Image_Ancienne)
			DeleteDC_(Image_HDC)
			
			; Supression de l'image
			FreeImage(Image)
			
		EndProcedure
		
    If CatchImage(0, ?Image)
			
			If OpenWindow(0, 100, 100, ImageWidth(0), ImageHeight(0), "Test 1", #PB_Window_BorderLess)
				
				SetLayeredWindow2(WindowID(0))
				AlphaImageWindow2(WindowID(0), ImageID(0), 0)
				
				StickyWindow(0, 1)
				
			EndIf
			
			Repeat
				Event = WaitWindowEvent()
				
				If Event = #WM_LBUTTONDOWN
					SendMessage_(WindowID(EventWindow()), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
				EndIf
				
			Until Event = #PB_Event_CloseWindow
			
		EndIf
		
    DataSection
			image:
			Data.l $474E5089,$0A1A0A0D,$0D000000,$52444849,$80000000,$80000000,$00000608,$613EC300,$000000CB,$4D416704,$AF000041,$8A0537C8
			Data.l $000000E9,$58457419,$666F5374,$72617774,$64410065,$2065626F,$67616D49,$61655265,$C9717964,$00003C65,$4449EA02,$DA785441
			Data.l $72599BEC,$451440DA,$98035A9F,$F34BD198,$EC8AB22E,$180A3B2C,$4D6EAC1B,$313B02B9,$2A299258,$A9CE543F,$5BBB75BA,$80E24943
			Data.l $611A88BE,$7BA9E766,$F75D43E6,$3549AFCC,$0F1AEF30,$D7D57DAD,$35E9731C,$D72F757C,$0F99EFA6,$EB67E775,$106BFE0C,$01000100
			Data.l $01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100,$01000100
			Data.l $01000100,$56E00100,$77E7EC48,$459C7455,$DB71DFD1,$E3EFE71F,$E7D16B3F,$45B64BB5,$C9FAF3EE,$C63B3B9A,$B9D3EFF5,$D79C75DD
			Data.l $E3BB9D9D,$7BEED79C,$FB57CC72,$C763DD75,$0CF4F8F3,$35DEE82E,$276EDB3B,$E005F8DB,$00080015,$00080008,$00080008,$00080008
			Data.l $00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$47FB4137
			Data.l $14511FF1,$E738C7D9,$FD43E73A,$35F9F39E,$77B8E389,$5A1E35DE,$D5FFB4BB,$AEE34331,$7BE935F9,$FBDD43E6,$E01DF2D9,$00080015
			Data.l $00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008
			Data.l $00080008,$00080008,$3CD440B7,$6B95363E,$FBD7197C,$EA766E32,$9FA922E7,$21D6A98E,$10EA95AD,$E87676DF,$ADCACF8D,$2F36AACF
			Data.l $B5EE5679,$0AACF3E6,$A6D4AF5A,$699D44F5,$A89EAC7D,$67AD3EA7,$E97AB9EA,$62426393,$5621566D,$CE08B6C7,$59B385E6,$197DD911
			Data.l $1B34A4D9,$B9A33A29,$D58D71A6,$AB04A971,$D2AB5792,$B3E9959D,$DB22B5B2,$A30B6B28,$997F8CB7,$F2DAF43F,$DDFCC6F1,$AB78FCD6
			Data.l $BBF2CEF1,$4BABDABD,$29D8D6A5,$F563C6A9,$3E5A9944,$3A17AB9A,$6CF2D2C7,$4DD07EA5,$3548583D,$B4BA4256,$885B9922,$DFC45667
			Data.l $2B1374AC,$74494CA3,$535B1695,$8914D625,$4FB2B9D5,$56A5DAAD,$CCDB2B3E,$6CB7A78A,$656B0B32,$CC8F5233,$B293FDAB,$96465E55
			Data.l $725579B7,$5750585D,$AB1C698A,$4CAC6553,$AA657B94,$6DF333CC,$D97E3A96,$B0E87A76,$522C2D4A,$1589162B,$589A6533,$F84CAF79
			Data.l $0015E005,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008,$00080008
			Data.l $00080008,$00080008,$00080008,$C1370008,$0006016F,$7D698A9A,$EDA484F5,$00000000,$444E4549,$826042AE
		EndDataSection ;}
		
		

Re: Des bulles dans le bureau

Publié : ven. 23/oct./2009 18:08
par Ollivier
Salut, LSI, je suis enchanté que tu adoptes ma petite astuce. Si on ne pouvait plus se refiler ses tuyaux, on serait bien malheureux tôt ou tard!

Voici un code plus "éparpillé" : il compare 3 traitements d'affichage alpha. Et j'avoue être désemparé par la légère différence entre l'affichage alpha d'un sprite et celui des deux autres (alphaimage ou layeredwindow qui sont identiques). C'est loin d'être quelquechose de grave, mais ça me turlupine.

Code : Tout sélectionner

; PureBasic 4.40
; Windows

Procedure LayeredWindow(Window, Image)
    Protected.POINT LTop, Size   
    Size\X = ImageWidth(Image)   
    Size\Y = ImageHeight(Image)
   
    ; 1) Préparation du handle
    HDC = CreateCompatibleDC_(StartDrawing(WindowOutput(Window) ) )
    SelectObject_(HDC, ImageID(Image) )
   
    ; 2) Mise à jour de la fenêtre
    Blend = $1FF0000
    UpdateLayeredWindow_(WindowID(Window), 0, 0, Size, HDC, @LTop, 0, @Blend, 2)
    StopDrawing()
   
    ; 3) Suppression du handle
    DeleteDC_(HDC)
EndProcedure

    CreateImage(1, 128, 128)
    StartDrawing(ImageOutput(1) )
        DrawingMode(#PB_2DDrawing_AlphaChannel)
        Box(0, 0, 128, 128, RGBA(0, 0, 0, 0) )
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        For I = 0 To 128
            J = I * 2
            Box(I, 0, 1, 32, RGBA(255, 255, 255, 255 - J) )
            Box(I, 32, 1, 32, RGBA(255, 140, 80, 255 - J) )
            Box(I, 64, 1, 32, RGBA(64 + I, 64 + I, 64 + I, 192 - I) )
            Box(I, 96, 1, 32, RGBA(Int(Pow(Sin(I / 42.0 + 1.6), 18.0) * 255.0), Int(Pow(Sin(I / 42.0 + 0.5), 18.0) * 255.0), Int(Pow(Sin(I / 42.0 - 0.5), 18.0) * 255.0), Int(Pow(Sin(I / 13.5 + 1.5), 2.0) * 255.0) ) )
        Next I
    StopDrawing()


   ; 1) Préparation de l'image
   CreateImage(0, ImageWidth(1), ImageHeight(1) )
   StartDrawing(ImageOutput(0) )
        DrawAlphaImage(ImageID(1), 0, 0)
        DrawingMode(#PB_2DDrawing_AlphaChannel)
        DrawAlphaImage(ImageID(1), 0, 0)
   StopDrawing()
   
   ; 2) Affichage de la fenêtre
   If OpenWindow(0, 266, 32, ImageWidth(0), ImageHeight(0), "", #PB_Window_BorderLess)
      SetWindowLong_(WindowID(0), #GWL_EXSTYLE, GetWindowLong_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_LAYERED)
      LayeredWindow(0, 0)
      StickyWindow(0, 1)
   EndIf
   
    InitSprite()
    InitSprite3D()

    Win = OpenWindow(-1, 0, 0, 640, 256, "DrawAlphaImage (à gauche)    Sprite3D (au centre)    Layered window (à droite)", $CF0000)
    OpenWindowedScreen(WindowID(win), 0, 0, 640, 256, 0, 0, 0)
    CreateSprite(0, 128, 128, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
    StartDrawing(SpriteOutput(0) )
        DrawAlphaImage(ImageID(0), 0, 0)
    StopDrawing()
    CreateSprite3D(0,0)
   
   
   ; 3) Traitement de la fenêtre
    Gosub PourLeFun
    Repeat
        Delay(1)  
        Event = WaitWindowEvent()
        If Event = #WM_LBUTTONDOWN
            SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
        EndIf
    Until Event = #PB_Event_CloseWindow
    End

PourLeFun:
    ClearScreen(RGBA(255, 0, 0, 0) )
    Start3D()
        DisplaySprite3D(0, 128, 0) 
    Stop3D()
    StartDrawing(ScreenOutput() )
        DrawAlphaImage(ImageID(1), 0, 0)
    StopDrawing()
    FlipBuffers()     
    Return
        

Re: Des bulles dans le bureau

Publié : sam. 24/oct./2009 11:11
par Le Soldat Inconnu
Tu as oublié de créer les images en 32 bits :mrgreen:

Code : Tout sélectionner

    ; PureBasic 4.40
    ; Windows
		
    Procedure LayeredWindow(Window, Image)
			Protected.POINT LTop, Size   
			Size\X = ImageWidth(Image)   
			Size\Y = ImageHeight(Image)
			
			; 1) Préparation du handle
			hdc = CreateCompatibleDC_(StartDrawing(WindowOutput(Window) ) )
        SelectObject_(hdc, ImageID(Image) )
				
        ; 2) Mise à jour de la fenêtre
        Blend = $1FF0000
        UpdateLayeredWindow_(WindowID(Window), 0, 0, Size, hdc, @LTop, 0, @Blend, 2)
			StopDrawing()
			
			; 3) Suppression du handle
			DeleteDC_(hdc)
		EndProcedure
		
		CreateImage(1, 128, 128, 32)
		StartDrawing(ImageOutput(1) )
			DrawingMode(#PB_2DDrawing_AlphaChannel)
			Box(0, 0, 128, 128, RGBA(0, 0, 0, 0) )
			DrawingMode(#PB_2DDrawing_AlphaBlend)
			For I = 0 To 128
				J = I * 2
				Box(I, 0, 1, 32, RGBA(255, 255, 255, 255 - J) )
				Box(I, 32, 1, 32, RGBA(255, 140, 80, 255 - J) )
				Box(I, 64, 1, 32, RGBA(64 + I, 64 + I, 64 + I, 192 - I) )
				Box(I, 96, 1, 32, RGBA(Int(Pow(Sin(I / 42.0 + 1.6), 18.0) * 255.0), Int(Pow(Sin(I / 42.0 + 0.5), 18.0) * 255.0), Int(Pow(Sin(I / 42.0 - 0.5), 18.0) * 255.0), Int(Pow(Sin(I / 13.5 + 1.5), 2.0) * 255.0) ) )
			Next I
		StopDrawing()
		
		
		; 1) Préparation de l'image
		CreateImage(0, ImageWidth(1), ImageHeight(1), 32)
		StartDrawing(ImageOutput(0) )
			DrawAlphaImage(ImageID(1), 0, 0)
			DrawingMode(#PB_2DDrawing_AlphaChannel)
			DrawAlphaImage(ImageID(1), 0, 0)
		StopDrawing()
		
		; 2) Affichage de la fenêtre
		If OpenWindow(0, 266, 32, ImageWidth(0), ImageHeight(0), "", #PB_Window_BorderLess)
			SetWindowLong_(WindowID(0), #GWL_EXSTYLE, GetWindowLong_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_LAYERED)
			LayeredWindow(0, 0)
			StickyWindow(0, 1)
		EndIf
		
		InitSprite()
		InitSprite3D()
		
		Win = OpenWindow(-1, 0, 0, 640, 256, "DrawAlphaImage (à gauche)    Sprite3D (au centre)    Layered window (à droite)", $CF0000)
		OpenWindowedScreen(WindowID(Win), 0, 0, 640, 256, 0, 0, 0)
		CreateSprite(0, 128, 128, #PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
		StartDrawing(SpriteOutput(0) )
			DrawAlphaImage(ImageID(0), 0, 0)
		StopDrawing()
		CreateSprite3D(0,0)
		
		
		; 3) Traitement de la fenêtre
		Gosub PourLeFun
		Repeat
			Delay(1) 
			Event = WaitWindowEvent()
			If Event = #WM_LBUTTONDOWN
				SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
			EndIf
		Until Event = #PB_Event_CloseWindow
		End
		
    PourLeFun:
		ClearScreen(RGBA(255, 0, 0, 0) )
		Start3D()
			DisplaySprite3D(0, 128, 0)
		Stop3D()
		StartDrawing(ScreenOutput() )
			DrawAlphaImage(ImageID(1), 0, 0)
		StopDrawing()
		FlipBuffers()     
		Return
		

Re: Des bulles dans le bureau

Publié : mar. 27/oct./2009 20:43
par Ollivier
En effet, autant pour moi... :(

Par contre, le dicernement reste toujours le même entre les sprites 3D (celle du milieu) et les deux autres.