Page 2 sur 3

Publié : sam. 22/sept./2007 19:39
par Kwai chang caine
@Brossden
Kcc tu as toujours le mot juste, la phrase qui tombe à pic !
Merci de tes mots !
Tu me fais sincerement plaisir par ton compliment, qui me touche 8)
Tout ce que j'ai dit, est sincere, j'suis un casse burne (ou plutot un colle aux burnes serait le terme plus exact :D), mais je suis toujours sincere.
D'ailleur, je ne sais pas mentir, mon ex-femme doir encore s'en rappeller, quand je suis allé lui annoncer tout de suite que j'avais ...Huummmm, bref :?

Cette sincérité ne m'a pas valu que des amis, donc je suis heureux qu'elle me fasse pas trop d'ennemis dans ce forum que j'aime. 8)

Meme quand, comme en ce moment, je programme en visual basic car je suis obligé, :oops: je clique toutes les heures pour avoir de vos nouvelles :D La famille c'est sacré non :roll:

Encore merci plutot à vous tous, pour me remonter le moral qui rejoint trop souvent celui de mon ami OLLIVER. :cry:

@OLLIVIER
Moi j'ai peur que ma 2e femme se barre avant que j'ai appris PureBasic à 80%.
Au moins j'aurait pas besoin de lui annoncer que je l'ai trompée, ou plutot si mais avec un language, plutot qu'avec une langue :D

Publié : dim. 23/sept./2007 22:41
par Ollivier
C'est quoi ça visual basic?

Publié : lun. 24/sept./2007 8:48
par Kwai chang caine
Visual basic c'est un mega programme qui pour coder un bouton sur une fenetre, nécéssite 4 CD d'install puis la mise à jour du SP6 qui prend encore 1/4 d'heure et la moitié de ton DD :lol:
Et encore une fois écrasé il lui faut encore d'autre outils pour pouvoir le déguster, les VBrun :? que si y'a pas, tu mange pas.
En fait pas de bras, pas de chocolat :D

En bref une pelleteuse pour ouvrir un oeuf ou plutot pour "écraser un oeuf", alors que PureBasic non seulement il est portable et s'installe en 3 coup de cuillere à pot, mais l'oeuf, il l'épluche, le découpe, insere la mayonnaise et le pose sur le plat, avec le petit bout de persil pour faire joli :D

Voila mon bon OLLIVIER, j'espere que ceci répond à ta question :wink:

Publié : lun. 24/sept./2007 8:50
par Ar-S
Kwai chang caine a écrit :Visual basic c'est un mega programme qui pour coder un bouton sur une fenetre, nécéssite 4 CD d'install puis la mise à jour du SP6 qui prend encore 1/4 d'heure et la moitié de ton DD :lol:

En bref une pelleteuse pour ouvrir un oeuf ou plutot pour "écraser un oeuf", alors que PureBasic non seulement il est portable et s'installe en 3 coup de cuillere à pot, mais l'oeuf, il l'épluche, le découpe, insere la mayonnaise et le pose sur le plat, avec le petit bout de persil pour faire joli :D

:wink:
C'est ben vrai c't'affaire !

Publié : lun. 24/sept./2007 8:52
par Kwai chang caine
@Ar-s
J'suis content de voir que toi aussi tu aime bien les oeufs "pas écrasés" :wink:

Publié : lun. 24/sept./2007 9:22
par Ar-S
Pour coller à ta métaphore, je dirai que VB est une poile de 150 kilos pour faire cuire un petit oeuf de caille :D .

Publié : lun. 24/sept./2007 9:55
par Kwai chang caine
Tout à fait, et meme si c'est une petite caille :D
Et encore t'es meme pas sur qu'a la fin il sera pas "mollet" :lol:

Publié : lun. 24/sept./2007 10:10
par Backup
allez savoir pourquoi d'un coup j'ai envie d'omelette moi :lol:

Publié : lun. 24/sept./2007 10:31
par Kwai chang caine
DOBRO, t'es pas cool, j'avais pourtant bien expliqué de ne pas parler bouffe devant moi :lol:

Publié : lun. 24/sept./2007 18:42
par Flype
Kwai chang caine a écrit :Visual basic c'est un mega programme qui pour coder un bouton sur une fenetre, nécéssite 4 CD d'install puis la mise à jour du SP6 qui prend encore 1/4 d'heure et la moitié de ton DD :lol:
Et encore une fois écrasé il lui faut encore d'autre outils pour pouvoir le déguster, les VBrun :? que si y'a pas, tu mange pas.
En fait pas de bras, pas de chocolat :D

En bref une pelleteuse pour ouvrir un oeuf ou plutot pour "écraser un oeuf", alors que PureBasic non seulement il est portable et s'installe en 3 coup de cuillere à pot, mais l'oeuf, il l'épluche, le découpe, insere la mayonnaise et le pose sur le plat, avec le petit bout de persil pour faire joli :D

Voila mon bon OLLIVIER, j'espere que ceci répond à ta question :wink:
:lol: :lol:

Publié : ven. 01/mai/2009 0:20
par Ollivier
J'ai remis à jour le code dans le premier topic de ce sujet.

Ollivier

Publié : lun. 04/mai/2009 9:02
par beauregard
Ollivier a écrit :J'ai remis à jour le code dans le premier topic de ce sujet.

Ollivier
merci :)

Re: Des bulles dans le bureau

Publié : sam. 03/oct./2009 19:20
par Le Soldat Inconnu
c'est marrant de voir que visiblement, tu n'a pas le même problème que moi avec les PNG et UpdateLayeredWindow_(

voir ici

Regarde cet exemple :
Fenêtre à gauche sans la correction, et celle de droite avec la correction.

voici l'image originale
Image

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
	Protected xx, yy, x, y, Rouge, Vert, Bleu, AlphaChannel
	
	; Précalcul
	Protected Dim Echelle.f($FF)
	For x = 0 To $FF
		Echelle(x) = x / $FF
	Next
	
	; Chargement du HDC
	Image_HDC = CreateCompatibleDC_(#NULL)
  Image_Ancienne = SelectObject_(Image_HDC, ImageID)
	
	
	; Dimension de l'image
	GetObject_(ImageID, SizeOf(BITMAP), @Image_Bitmap)
	Image_BitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
	Image_BitmapInfo\bmiHeader\biWidth = Image_Bitmap\bmWidth
	Image_BitmapInfo\bmiHeader\biHeight = Image_Bitmap\bmHeight
	Image_BitmapInfo\bmiHeader\biPlanes = 1
	Image_BitmapInfo\bmiHeader\biBitCount = 32
	
	If Calcul
		; Zone mémoire pour copier l'image
		xx = Image_Bitmap\bmWidth - 1
		yy = Image_Bitmap\bmHeight - 1
		Protected Dim Image.l(xx, yy)
		
		; Copie de l'image en mémoire
		GetDIBits_(Image_HDC, ImageID, 0, Image_Bitmap\bmHeight, @Image(), @Image_BitmapInfo, #DIB_RGB_COLORS)
		
		; Modification de l'image en mémoire
		For x = 0 To xx
			For y = 0 To yy
				Couleur = Image(x, y)
				AlphaChannel = Couleur >> 24 & $FF
				If AlphaChannel < $FF
					Rouge = (Couleur & $FF) * Echelle(AlphaChannel)
					Vert = (Couleur >> 8 & $FF) * Echelle(AlphaChannel)
					Bleu = (Couleur >> 16 & $FF) * Echelle(AlphaChannel)
					Image(x, y) = Rouge | Vert << 8 | Bleu << 16 | AlphaChannel << 24
				EndIf
			Next
		Next
		
		; Transfert de la mémoire dans la l'image de base
		SetDIBits_(Image_HDC, ImageID, 0, Image_Bitmap\bmHeight, @Image(), @Image_BitmapInfo, #DIB_RGB_COLORS)
	EndIf
	
	; 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_BitmapInfo + 4, Image_HDC, @ContextOffset, 0, @Blend, 2)
	
	; Fermeture du HDC
	SelectObject_(Image_HDC, Image_Ancienne)
	DeleteDC_(Image_HDC)
  
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
	If OpenWindow(1, 300, 100, ImageWidth(0), ImageHeight(0), "Test 2", #PB_Window_BorderLess)
		
		SetLayeredWindow2(WindowID(1))
		AlphaImageWindow2(WindowID(1), ImageID(0), 1)
		
		StickyWindow(1, 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 ;}

J'aimerais bien avoir la source de ton image pour voir. Merci

Re: Des bulles dans le bureau

Publié : sam. 03/oct./2009 22:52
par Ollivier
@LSI,

Vois-tu, huit jours après la publication de ce code de 2007, la source m'était égale : on le constate ici, elle n'est plus dans la DataSection sous forme de données compactées, mais elle est dans la procédure Lactee() sous forme de code (En 4.40, la seule erreur du programme t'y emmènera les yeux fermés!). Elle est basée sur le principe de l'affichage d'une bille à jouer, plutôt que d'une bulle. Bien entendu, le rendu alpha y était aussi bourrin que de se moquer des lois de l'optique, je te l'accorde.

En fait, l'explication de la subtilité n'est pas dans la source du support de l'objet, mais dans la nature même de l'objet. Il y a deux modes Blend en un, donc je pense que ce n'est pas une correction qu'il faille effectuer mais une distribution des mélanges, d'un côté, ce qui est brillant, et de l'autre ce qui est mat.

Ollivier

Re: Des bulles dans le bureau

Publié : lun. 05/oct./2009 3:12
par Ollivier
Bon... Visiblement, et à ma grande surprise, mon explication ne t'enchante pas. Je la croyais suffisante... Je vais m'expliquer à partir de ton code qui te pose problème...

Dans ton code, tout d'abord, ça:

Code : Tout sélectionner

   ; Précalcul
   Protected Dim Echelle.f($FF)
   For x = 0 To $FF
      Echelle(x) = x / $FF
   Next
... ça part à la poubelle (car inutile);

Ensuite, ça aussi:

Code : Tout sélectionner

   ; Dimension de l'image
   GetObject_(ImageID, SizeOf(BITMAP), @Image_Bitmap)
   Image_BitmapInfo\bmiHeader\biSize = SizeOf(BITMAPINFOHEADER)
   Image_BitmapInfo\bmiHeader\biWidth = Image_Bitmap\bmWidth
   Image_BitmapInfo\bmiHeader\biHeight = Image_Bitmap\bmHeight
   Image_BitmapInfo\bmiHeader\biPlanes = 1
   Image_BitmapInfo\bmiHeader\biBitCount = 32
... ça part direction la poubelle (car inutile);

Et enfin, ce gros morceau-ci:

Code : Tout sélectionner

   If Calcul
      ; Zone mémoire pour copier l'image
      xx = Image_Bitmap\bmWidth - 1
      yy = Image_Bitmap\bmHeight - 1
      Protected Dim Image.l(xx, yy)
      
      ; Copie de l'image en mémoire
      GetDIBits_(Image_HDC, ImageID, 0, Image_Bitmap\bmHeight, @Image(), @Image_BitmapInfo, #DIB_RGB_COLORS)
      
      ; Modification de l'image en mémoire
      For x = 0 To xx
         For y = 0 To yy
            Couleur = Image(x, y)
            AlphaChannel = Couleur >> 24 & $FF
            If AlphaChannel < $FF
               Rouge = (Couleur & $FF) * Echelle(AlphaChannel)
               Vert = (Couleur >> 8 & $FF) * Echelle(AlphaChannel)
               Bleu = (Couleur >> 16 & $FF) * Echelle(AlphaChannel)
               Image(x, y) = Rouge | Vert << 8 | Bleu << 16 | AlphaChannel << 24
            EndIf
         Next
      Next
      
      ; Transfert de la mémoire dans la l'image de base
      SetDIBits_(Image_HDC, ImageID, 0, Image_Bitmap\bmHeight, @Image(), @Image_BitmapInfo, #DIB_RGB_COLORS)
   EndIf
... C'est poubelle aussi, car c'est inutile.


En terme d'affichage, on obtient ceci:

Code : Tout sélectionner

; PureBasic 4.40

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

UsePNGImageDecoder()
If CatchImage(1, ?Image)

   ; 1) Préparation de l'image
   CreateImage(0, ImageWidth(1), ImageHeight(1) )
   StartDrawing(ImageOutput(0) )
        DrawAlphaImage(ImageID(1), 0, 0) ; Ce qui est brillant
        DrawingMode(#PB_2DDrawing_AlphaChannel)
        DrawAlphaImage(ImageID(1), 0, 0) ; Ce qui est mat
   StopDrawing()
   
   ; 2) Affichage de la fenêtre
   If OpenWindow(0, 100, 100, 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
   
   ; 3) Traitement de la fenêtre
   Repeat
      Event = WaitWindowEvent()
      If Event = #WM_LBUTTONDOWN
         SendMessage_(WindowID(0), #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
Comme ça, l'affichage n'est plus qu'un détail opérationnel. D'autres questions? :roll: