Page 1 sur 1

Trou dans une fenêtre sans pouvoir cliquer au travers

Publié : ven. 18/févr./2011 20:57
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

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

Publié : ven. 18/févr./2011 21:08
par boddhi
Sous XP SP3, ça fonctionne correctement...
La fenêtre du dessous reprend bien le focus...

Je vais tester sous Vista

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

Publié : ven. 18/févr./2011 21:11
par boddhi
Bon, bah fonctionne pas sous Vista SP2

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

Publié : ven. 18/févr./2011 21:23
par Le Soldat Inconnu
pff, si quelqu'un a une solution autre que d'utiliser des régions ( SetWindowRgn_ ), je suis preneur

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

Publié : ven. 18/févr./2011 21:30
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.

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

Publié : ven. 18/févr./2011 21:49
par nico
marche sur vista sp2 32bits,
t'es obliger d'utiliser une fenetre sinon essaye avec un gadget image.

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

Publié : dim. 20/févr./2011 21:12
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

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

Publié : lun. 21/févr./2011 17:37
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é!

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

Publié : jeu. 24/févr./2011 12:42
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?

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

Publié : jeu. 24/févr./2011 13:21
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.

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

Publié : sam. 26/févr./2011 15:30
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

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

Publié : dim. 27/févr./2011 19:19
par nico
De rien, on a toujours besoin d'un meilleur codeur que soi! :mrgreen: