Trou dans une fenêtre sans pouvoir cliquer au travers

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Trou dans une fenêtre sans pouvoir cliquer au travers

Message par Le Soldat Inconnu »

Salut,

Une bizarrerie sur Windows 7

J'ai fais une fenêtre avec un trou pour voir les fenêtres dessous sauf qu'il est impossible de cliquer sur la fenêtre de dessous.

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
	End
EndIf

SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FE)

OpenWindow(1, 0, 0, 200, 200, "Trou", #PB_Window_BorderLess, WindowID(0))
SetWindowColor(1, $FF00FE)

SetParent_(WindowID(1), WindowID(0))
Style = GetWindowLongPtr_(WindowID(1), #GWL_STYLE)
SetWindowLongPtr_(WindowID(1), #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
SetWindowPos_(WindowID(1), 0, 100, 100, 300, 300, 0)

Repeat
	Event = WaitWindowEvent()
	
	Select Event
		Case #PB_Event_Menu
			Select EventMenu() ; Menus
					
			EndSelect
			
		Case #PB_Event_Gadget
			Select EventGadget() ; Gadgets
					
			EndSelect
	EndSelect
	
Until Event = #PB_Event_CloseWindow
ça le fait sur d'autre version de windows ?

Et si je veux pouvoir cliquer au travers, comment dois-je procéder ? 8O Parce que j'en ai besoin
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par boddhi »

Sous XP SP3, ça fonctionne correctement...
La fenêtre du dessous reprend bien le focus...

Je vais tester sous Vista
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par boddhi »

Bon, bah fonctionne pas sous Vista SP2
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par Le Soldat Inconnu »

pff, si quelqu'un a une solution autre que d'utiliser des régions ( SetWindowRgn_ ), je suis preneur
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par boddhi »

J'ai remarqué un comportement étrange de la fenêtre, je ne sais pas si il y a un lien ou si c'est une conséquence logique, je te le signale toutefois :
Une fois la fenêtre affichée, lorsque tu cliques sur une fenêtre située en dessous mais hors de la fenêtre "Groupe Exploreur", le raccourci dans la barre des tâches ne réagit pas correctement lorsque tu veux ramener cette dernière au premier plan.

Il faut cliquer plusieurs fois dessus pour qu'elle revienne au premier plan alors que ce n'est pas le cas pour toute autre fenêtre...

Et cela aussi bien sous XP que sous Vista.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par nico »

marche sur vista sp2 32bits,
t'es obliger d'utiliser une fenetre sinon essaye avec un gadget image.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par Le Soldat Inconnu »

Salut Nico,

ce n'est pas mieux avec un imagegadget ou containergadget.
Bref je cale.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50

If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
	End
EndIf

RunProgram("explorer.exe", "C:\", "")
Delay(2000)
id = GetForegroundWindow_()
SetParent_(id, WindowID(0))
Style = GetWindowLongPtr_(id, #GWL_STYLE)
SetWindowLongPtr_(id, #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)


SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FE)

CreateImage(1, 300, 300, 24)
StartDrawing(ImageOutput(1))
	Box(0, 0, 300, 300, $FF00FE)
StopDrawing()
ImageGadget(1, 0, 0, 300, 300, ImageID(1))
; ContainerGadget(1, 100, 100, 300, 300, #PB_Container_BorderLess)
	; SetGadgetColor(1, #PB_Gadget_BackColor, $FF00FE)
; CloseGadgetList()

; OpenWindow(1, 0, 0, 200, 200, "Trou", #PB_Window_BorderLess, WindowID(0))
; SetWindowColor(1, $FF00FE)
; 
; SetParent_(WindowID(1), WindowID(0))
; Style = GetWindowLongPtr_(WindowID(1), #GWL_STYLE)
; SetWindowLongPtr_(WindowID(1), #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)
; SetWindowPos_(WindowID(1), 0, 100, 100, 300, 300, 0)

Repeat
	Event = WaitWindowEvent()
	
	Select Event
		Case #PB_Event_Menu
			Select EventMenu() ; Menus
					
			EndSelect
			
		Case #PB_Event_Gadget
			Select EventGadget() ; Gadgets
					
			EndSelect
		Case #PB_Event_SizeWindow
			SetWindowPos_(id, GadgetID(1), 0, 0, WindowWidth(0), WindowHeight(0), 0)
			
	EndSelect
	
Until Event = #PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par nico »

J'ai essayé ce code hier, ça ne marchait pas et aujourd'hui; ça roule!

J'avais déjà remarquer des problèmes avec cette api.

Doit y avoir un truc, mais quoi, j'ai pas trouvé!
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par nico »

Je viens de réessayer ton premier code et je me suis aperçu qu'en changeant la couleur de transparence à:
FF00FF

cela fonctionnait!

Il y a d'autre couleur de transparence qui pose problème comme le blanc!


Sinon, pour le 2ème code, celui ci fonctionne chez moi:

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
ProcedureDLL SetLayeredWindow(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 SetLayeredWindowAttributes(WindowID.l, Alpha.l, Color.l) ; Transparence et forme de la fenêtre
  Protected Parametre.l
  If Alpha > 0
    Parametre | #LWA_ALPHA
  Else
    Alpha = 255
  EndIf
  If Color > 0
    Parametre | #LWA_COLORKEY
  Else
    Color = 0
  EndIf
  SetLayeredWindowAttributes_(WindowID, Color, Alpha, Parametre)
EndProcedure
  Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
    ; Nous pouvons tester dans la callback les paramètres renseignés automatiquement par windows
    
    If uMsg = #WM_NCHITTEST
      Debug "popo"
    ProcedureReturn #HTTRANSPARENT
    EndIf 
  
    ProcedureReturn #PB_ProcessPureBasicEvents 
  EndProcedure 
 
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50

If OpenWindow(0, 0, 0, 800, 600, "Groupe Exploreur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget) = 0
   End
EndIf

SetLayeredWindow(WindowID(0))
SetLayeredWindowAttributes(WindowID(0), -1, $FF00FF)

RunProgram("explorer.exe", "C:\", "")
Delay(5000)
id = GetForegroundWindow_()
SetParent_(id, WindowID(0))
Style = GetWindowLongPtr_(id, #GWL_STYLE)
SetWindowLongPtr_(id, #GWL_STYLE, (Style | #WS_CHILDWINDOW) & ~#WS_TILEDWINDOW)


If CreateImage(1, 300, 300, 32)
  If StartDrawing(ImageOutput(1))
    Box(0, 0, 300, 300, $FF00FF)
    StopDrawing()
  EndIf 
EndIf
   
ImageGadget(1, 0, 0, 300, 300, ImageID(1))

SetWindowPos_(GadgetID(1),id,0,0,0,0,3)


Repeat
   Event = WaitWindowEvent()
   
   Select Event
      Case #PB_Event_Menu
         Select EventMenu() ; Menus
               
         EndSelect
         
      Case #PB_Event_Gadget
         Select EventGadget() ; Gadgets
               
         EndSelect
      Case #PB_Event_SizeWindow
         SetWindowPos_(id, GadgetID(1), 0, 0, WindowWidth(0), WindowHeight(0), 0)
         
   EndSelect
   
Until Event = #PB_Event_CloseWindow

Dis moi si ça résoud ton problème?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par Ar-S »

Je confirme en 7x64 ça marche, par contre la fenêtre explorer met un bon moment à se transformer pour faire apparaitre le carré transparent.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par Le Soldat Inconnu »

pour le délai, c'est normal :mrgreen: c'est codé par un cochon.

Sinon, bien vu pour le coup de la couleur 8O
C'est vraiment bizarre ça
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Trou dans une fenêtre sans pouvoir cliquer au travers

Message par nico »

De rien, on a toujours besoin d'un meilleur codeur que soi! :mrgreen:
Répondre