Dessiner sur une surface transparente

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Dessiner sur une surface transparente

Message par Mesa »

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 800, 600, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ;SetWindowColor(0, RGB(255, 165, 0)) 

    CompilerIf #PB_Compiler_Version>511
    CreateImage(0, 200,200,32,#PB_Image_Transparent )   ; Si vous utilisez PB 5.2 
    
  CompilerElse
    CreateImage(0, 200,200,32|#PB_Image_Transparent ) ; Ou si vous utilisez PB 5.11 ou moins
    
  CompilerEndIf
  
  
  ;CreateImage(0, 200,200,32,#PB_Image_Transparent )   ; Si vous utilisez PB 5.2  
  ;CreateImage(0, 200,200,32|#PB_Image_Transparent )  ; Ou si vous utilisez PB 5.11 
  
  StartDrawing(ImageOutput(0))
  
  DrawingMode( #PB_2DDrawing_AlphaBlend) ; A ne pas oublier ...
  LineXY(0,20,200,20, RGBA(0,0,255,255)) ; Ligne en dessous du futur texte
  
  ;Cadre rouge sur fond transparent
  DrawingMode(#PB_2DDrawing_Outlined| #PB_2DDrawing_AlphaBlend)
  Box(0,0,200,200,RGBA(255,0,0,255))
  
  ;Pour écrire sans fond : Méthode 1
  DrawingMode(#PB_2DDrawing_AlphaBlend|#PB_2DDrawing_Transparent)
  DrawText(10, 10, "Texte", RGBA(255,255,0,255))
  
  ;Pour écrire sans fond : Méthode 2
  DrawingMode(#PB_2DDrawing_AlphaBlend)
  DrawText(10, 60, "Texte", RGBA(255,0,255,255), RGBA(0,0,0,0))
  
  DrawingMode( #PB_2DDrawing_AlphaBlend)
  LineXY(0,70,200,70, RGBA(0,0,255,255)) ; Ligne au dessus du texte
  
  StopDrawing()
  
  ImageGadget(0,  300, 200, 200, 200, ImageID(0))   
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

[Edition] Légère modif pour les allergiques aux versons bêta :wink:

Mesa.
Dernière modification par Mesa le lun. 09/sept./2013 13:17, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dessiner sur une surface transparente

Message par Backup »

ce serai bien de préciser la Version de Purebasic car chez moi (je suis encore en 5.11)

ça :

Code : Tout sélectionner

 CreateImage(0, 200,200,32,#PB_Image_Transparent ); 
, ça genere une erreur !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Dessiner sur une surface transparente

Message par Mesa »

Modif ok.

Mesa.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Dessiner sur une surface transparente

Message par Backup »

pas mal ,

pour info , bien avant les modes de transparence
j'avais fait ce code

pendant 5 secondes il montre une transparence entre un text et le fond
c'est de la bidouille , mais ça marchait :)
le text c'est l'image transparente ;)

Code : Tout sélectionner

; Code By Dobro
;***********************************************
;Titre  :illusion image_transparente
;Auteur  : Dobro
;Date  :09/09/2013
;Heure  :16:56:15
;Version Purebasic :  PureBasic 5.11 (Windows - x86)
;Version de l'editeur :EPB V2.40
; Libairies necessaire : Aucune 
;***********************************************

Declare  OpenWindow_Window()
Declare  affiche_image_transparent(num_window,text$,x,y,larg,haut)




;{- Enumerations / DataSections
;{ Windows
Enumeration
	#Window
EndEnumeration
;}
;{ Gadgets
Enumeration
	#Editor
	#image
EndEnumeration
;}
;}
Procedure OpenWindow_Window()
	If OpenWindow(#Window, 447, 170, 400, 400, "Test", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
		;If CreateGadgetList(WindowID(#Window))
		
		EditorGadget(#Editor, 17, 28, 364, 352)
		SetGadgetText(#Editor, "ceci est un editeur ")
		
		;EndIf
	EndIf
EndProcedure

OpenWindow_Window()
text$="Coucou"
x=330
y=100
larg=200
haut=40
num_window=#window
affiche_image_transparent(num_window,text$,x,y,larg,haut)
;{- Event loop

Repeat
	
	Select WaitWindowEvent(2)
		; ///////////////////
		Case #PB_Event_Gadget
		Select EventGadget()
			Case #Editor
		EndSelect
		; ////////////////////////
		Case #PB_Event_CloseWindow
		Select EventWindow()
			
			Case #Window
			CloseWindow(#Window)
			Break
		EndSelect
	EndSelect
Forever
;
;}




procedure affiche_image_transparent(num_window,text$,x,y,larg,haut)
	; By Dobro
	; on va creer l'illusion de transparence !!
	; principe : on effectue une copie d'ecran de ce qui se trouve sous l'image
	; on pose cette copie dans l'image ,
	; on ecrit le text en mode transparent dans l'image
	; on affiche le tout
	; on a ainsi l'illusion d'une image transparente
	
	;{ ne pas toucher la dedans
	; ************************************************************************
	source=GetDC_( WindowID (num_window))
	if CreateImage(#image,larg,haut,32)
		Destination = StartDrawing(ImageOutput(#image))
		BitBlt_(Destination,0,0,Larg,Haut,source,x,y,#SRCCOPY)
		ReleaseDC_(WindowID (num_window),Destination)
		ReleaseDC_(WindowID (num_window),source)
		DrawingMode(#PB_2DDrawing_Transparent)
		DrawText(1,1,text$,RGB(0,255,0),RGBA(0,0,0,0))
	StopDrawing()
	Else
	MessageRequester("info","pas pu creer l'image")
	ProcedureReturn
endif
; ***********************************************************************
;}

; ici on dessine dans notre image transparente
; vous pouvez vous servir de cette image comme vous le voulez (ici j'ecrit un text , mais vous pouvez dessiner un rond un carre ...etc ... )
; on l'affiche sur la fenetre
If IsImage(#image)
	StartDrawing(WindowOutput(num_window))
		DrawImage(ImageID( #image),x,y)
	StopDrawing()
endif

delay(5000) ; pendant 5 secondes


;{ ne pas toucher la dedans
; ************************************************************************
; detruit l'image
If IsImage((#image))<>0
	FreeImage(#image)
EndIf
; ************************************************************************
;}
endprocedure


; EPB
Répondre