Page 1 sur 1

Ordre des fenêtre et LayeredWindow

Publié : dim. 18/avr./2010 22:26
par Le Soldat Inconnu
Lancer moi ce code et dite si il n'y a rien qui vous choque.

Sous XP, c'est un vrai bordel

La fenêtre TopMost Layered reste derrière la fenetre non TopMost Layered mais la fenetre la topmost layered est devant la fenêtre normale et la fenêtre non TopMost layered est derrière la fenêtre normale.

ça parait confu mais le code illustre bien le problème

Code : Tout sélectionner

; PureBasic 4.40

ProcedureDLL 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

ProcedureDLL AlphaImageWindow2(WindowID, ImageID) ; Mettre une image PNG comme fond d'une fenêtre
  Protected Image_HDC, Image_Bitmap.BITMAP, ContextOffset.POINT, Blend.BLENDFUNCTION, Image
	
	; 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


; Procedure Callback(WindowID, message, wParam, lParam)
	; Protected *WindowPos.WINDOWPOS
	; Result = #PB_ProcessPureBasicEvents
	; If WindowID(0) = WindowID
		; If message = #WM_WINDOWPOSCHANGING ; Window position is about to change !
			; *WindowPos = lParam
			; *WindowPos\hwndInsertAfter = #HWND_TOPMOST   ; <-- Forces the window to stay in the background
		; EndIf
	; EndIf
	; If WindowID(1) = WindowID
		; If message = #WM_WINDOWPOSCHANGING ; Window position is about to change !
			; *WindowPos = lParam
			; *WindowPos\hwndInsertAfter = #HWND_BOTTOM   ; <-- Forces the window to stay in the background
		; EndIf
	; EndIf
	; ProcedureReturn Result
; EndProcedure

CreateImage(0, 200, 200, 32)
StartDrawing(ImageOutput(0))
	DrawingMode(#PB_2DDrawing_AlphaChannel)
	Box(0, 0, 200, 200, $80000000)
	DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
	DrawText(10, 10, "Premier plan / Topmost", $FFFFFFFF)
StopDrawing()
CreateImage(1, 200, 200, 32)
StartDrawing(ImageOutput(1))
	Box(0, 0, 200, 200, $0000FF)
	DrawingMode(#PB_2DDrawing_AlphaChannel)
	Box(0, 0, 200, 200, $FF000000)
	DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
	DrawText(10, 10, "Normal / NonTopmost", $FFFFFFFF)
StopDrawing()

If OpenWindow(1, 150, 150, ImageWidth(0), ImageHeight(0), "Test", #PB_Window_BorderLess)
	
	SetLayeredWindow2(WindowID(1))
	AlphaImageWindow2(WindowID(1), ImageID(1))
	
	If OpenWindow(0, 100, 100, ImageWidth(0), ImageHeight(0), "Test", #PB_Window_BorderLess)
		
		SetLayeredWindow2(WindowID(0))
		AlphaImageWindow2(WindowID(0), ImageID(0))
		
		StickyWindow(0, 1)
		; SetWindowCallback(@Callback())
		
		If OpenWindow(2, 200, 200, 200, 200, "Test")
			
			Repeat
				Event = WaitWindowEvent()
				
				If Event = #WM_LBUTTONDOWN
					SendMessage_(WindowID(EventWindow()), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
				ElseIf Event = #WM_MOUSEMOVE
					; Debug "ok"
				EndIf
				
			Until Event = #PB_Event_CloseWindow
			
		EndIf
	EndIf
EndIf

Re: Ordre des fenêtre et LayeredWindow

Publié : dim. 18/avr./2010 23:18
par Backup
chez moi (xp sp3) j'ai

le noir devant, la fenetre au milieu , la rouge derriere :)

Re: Ordre des fenêtre et LayeredWindow

Publié : dim. 18/avr./2010 23:58
par TazNormand
Sous Vista SP2 j'ai dans l'ordre
1° Noir Premier plan / Topmost
2° Test fenêtre normale
3° Rouge Non Topmost

OK pour moi aussi

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 9:17
par PAPIPP
Bonjour LSI
Sous XP SP3
Ordre au lancement
1) Fenêtre noire transparente
2) Fenêtre grise
3) Fenêtre rouge
Après déplacement
1) la fenêtre noire transparente reste toujours au dessus
2) pour les autres fenêtres l'ordre des fenêtre suit la chronologie que l’on a donné aux fenêtres
la plus ancienne déplacée tout au fond la plus récente au dessus mais la noire toujours en premier

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 9:51
par Le Soldat Inconnu
donc il y a un truc avec mon PC alors, je vais essayer sur un autre PC. Parce que ça me fatigue ce truc.

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 10:25
par Ar-S
Pareil que les copains sous Xp SP3

Image

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 10:56
par Le Soldat Inconnu
Oui, merci pour le screen, c'est bien sous mon PC que j'ai un soucis. Faut que je cherche, c'est pas normal.

Il faut que je regarde du coté de "Samurize", ça doit être lui je pense.

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 11:12
par Backup
@ar-s : tu as utilisé quoi comme "capturateur" d'ecran ?

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 11:32
par cederavic
Je te rassure Régis, c'est pas net sur mon pc non plus... (ATI sushi?)
La noir est devant la normale et derriere la rouge
La rouge est devant la noire et derriere la normale
La normale et derriere la noire et devant la rouge

On dirait le phenomene du cylindre torsadé à 360° :lol:

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 12:34
par Le Soldat Inconnu
par contre, si tu cliques la ou la fenêtre noire est sous la rouge, tu déplaces la fenêtre noire. Bon je suis pas tout seul a avoir cette bizarerie.

Sur le PC du boulot, c'est bon, chez moi, c'est pas bon

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 18:32
par Le Soldat Inconnu
Je ne sais plus, ATI, je pense pas, ARS à une ATI et ça marche pour lui.

9a fonctionne en machine virtuel sous vista et xp

Re: Ordre des fenêtre et LayeredWindow

Publié : lun. 19/avr./2010 21:51
par Ar-S
Dobro a écrit :@ar-s : tu as utilisé quoi comme "capturateur" d'ecran ?
La touche printscreen puis paint.net

@Lsi => HD4850 c'est de l'ati je confirme ;)

Re: Ordre des fenêtre et LayeredWindow

Publié : ven. 30/avr./2010 21:20
par Le Soldat Inconnu
Bug trouvé !

C'est cette putain d'ATI de m.... c'est la dernière fois que j'achète chez eux, il me saoule.

Il suffit de couper le démarrage du catalyst avec Windows et tout rentre dans l'ordre. Franchement, c'est n'importe quoi !

Voila le bug pour les curieux :
Image

Re: Ordre des fenêtre et LayeredWindow

Publié : ven. 30/avr./2010 22:18
par Backup
ma premiere carte graph etait une Ati

ben je suis vite passé chez Nvidia ;)

j'avais ds problemes de compatibilité avec des jeux sans arret , alors j'ai fuit :)

Re: Ordre des fenêtre et LayeredWindow

Publié : ven. 30/avr./2010 23:01
par venom
j'ai aps tester le code,

mais j'ai moi aussi montée 2 ati et bien je vais vite les virer des que possible j'ai des erreurs aussi dans tous les sens sa me saoul. :cry:






@++