Page 1 sur 2

détection souris dans fenetre ou bureau

Publié : jeu. 28/févr./2008 20:37
par venom
bonsoiir,
voila je cherche mais je ne trouve pas comment faire pour que mon programme détecte si ma souris est dans ma fenetre ou sur mon bureau ( hors de ma fenetre ).

en claire :wink:

quand mon curseur est sur le bureau ma fenetre fait 600x100 et quand mon curseur est sur ma fenetre elle passe en 600x200.

bon tester mon code vous comprenderai mieu :wink: .
sa fonctionne mais que dans un sens :? ou dans les 2 sens mais seulement qu'avec un gadget.

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)

  window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(8, 10,  10, 200, 20, "reduire")

    EndIf


  Repeat
   EventID = WaitWindowEvent()
   Select EventID
    Case #WM_MOUSEMOVE
      Select WindowFromPoint_(DesktopMouseX(), DesktopMouseY()); On regarde le gadget qui est sous la souris
        
        Case WindowID(#Window_0)
         ResizeWindow(#Window_0, WindowX(#Window_0), WindowY(#Window_0), 600, 200)
        Case GadgetID(8)
         ResizeWindow(#Window_0, WindowX(#Window_0), WindowY(#Window_0), 600, 100)
         
      EndSelect
   EndSelect 

    If EventID = #PB_Event_Gadget 
      Select EventGadget()
      
      EndSelect
    EndIf
  Until EventID = #PB_Event_CloseWindow
ps: tester en passant le curseur de la souris sur le bouton vous comprendrai mieux.
désolé pour la comprehention mais je n'arrive pas trop a expliquer :? .



@++

Publié : jeu. 28/févr./2008 20:56
par nico
T'es obligé de passer par un timer car i n'y a pas d'évènement qui t'indique quand la souris quitte la fenêtre.

Publié : jeu. 28/févr./2008 21:04
par Octavius
Et un truc dans ce genre ?

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)

  window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)

Procedure CursorDetection()

Width=WindowWidth(#Window_0)
Height=WindowHeight(#Window_0)
WinX=WindowX(#Window_0)
WinY=WindowY(#Window_0)
X=DesktopMouseX()
Y=DesktopMouseY()
Debug WinX
Debug WinY
Debug X
Debug Y

If ( X>WinX Or X>WinX+Width ) And ( Y>WinY And Y<WinY+Height )
  ProcedureReturn 1
Else
  ProcedureReturn 0
EndIf

EndProcedure

  Repeat
   
   If CursorDetection()=1
     ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
   Else
     ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
   EndIf
    
   EventID = WaitWindowEvent()
   Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      
      EndSelect
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow

Publié : jeu. 28/févr./2008 21:14
par venom
T'es obligé de passer par un timer car i n'y a pas d'évènement qui t'indique quand la souris quitte la fenêtre
ok merci de tes conseille dommage qu'il n'y a pas de fonction pour la sortie d'une fenetre :?

merci aussi Octavius
si je comprend ton code, cette ligne:
( X>WinX Or X>WinX+Width ) And ( Y>WinY And Y<WinY+Height )
sa renvoie si le curseur est bien dans la fenêtre. si il est hors de cette distance la fenêtre réduire c'est bien sa ?



@++

Publié : jeu. 28/févr./2008 21:20
par Octavius
Oui c'est ça, mais j'ai trouvé une petite amélioration à ce sujet, ça marche mieux et c'est plus simple :

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)

  window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)

Procedure CursorDetection()

Width=WindowWidth(#Window_0)
Height=WindowHeight(#Window_0)
WinX=WindowX(#Window_0)
WinY=WindowY(#Window_0)
X=WindowMouseX(#Window_0)
Y=WindowMouseY(#Window_0)

If X<0 Or Y<0
  ProcedureReturn 0
Else
  ProcedureReturn 1
EndIf

EndProcedure

  Repeat
   
   
   If CursorDetection()=1
     ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
   Else
     ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
   EndIf
    
   EventID = WaitWindowEvent()
   Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      
      EndSelect
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow
Ya encore un petit soucis, c'est que ça marche pas si tu bouges ta souris trop vite. La solution pour remédier à ce détail c'est effectivement d'utiliser un timer.

Publié : jeu. 28/févr./2008 21:27
par Octavius
Bon ça y est j'ai réglé le problème avec le timer, voici la version finale, je pense que c'est exactement ce que tu voulais, non ?

TADAAAAA!! :

Code : Tout sélectionner

;- Window Constants
Enumeration
  #Window_0
EndEnumeration
ExamineDesktops()
DesktopName(0)

  window = OpenWindow(#Window_0, 0, 0, 600, 100, "test souris",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered)

Procedure CursorDetection()

If WindowMouseX(#Window_0)<0 Or WindowMouseY(#Window_0)<0
  ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100)
Else
  ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200)
EndIf

EndProcedure

SetTimer_(WindowID(#Window_0),0,10,@CursorDetection())

  Repeat

   EventID = WaitWindowEvent()
   Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
      
      EndSelect
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow

Publié : jeu. 28/févr./2008 21:47
par venom
oui merci c'est exactement sa en plus sa fonctionne super bien avec un timer et le code est encore plus court merci a toi et nico pour le timer :wink: .


@++

Publié : jeu. 28/févr./2008 22:04
par nico
Attention, la procédure de rappel du timer est celle ci:

CursorDetection(hwnd.l,uMsg.l,idEvent.l,dwTime.l) et non CursorDetection()

Voir MSDN

Publié : jeu. 28/févr./2008 22:50
par Octavius
Effectivement, pourtant ça marche sans problème ?! Aurais-tu une explication ? Y a-t-il un risque que ça bug dans certaines circonstances ?

Publié : ven. 29/févr./2008 9:39
par Kwai chang caine
Si ça peut vous servir.
Moi dans un de mes programmes, j'ai fait comme ça :

Code : Tout sélectionner

;- Window Constants 
Enumeration 
  #Window_0 
EndEnumeration 
ExamineDesktops() 

OpenWindow(#Window_0, 0, 0, 600, 100, "test souris",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered) 

Repeat 

 EventID = WindowEvent() 
 Delay(10)
 
 If DesktopMouseX() < WindowX(#Window_0) Or DesktopMouseY() < WindowY(#Window_0) Or DesktopMouseX() > WindowX(#Window_0) + WindowWidth(#Window_0) Or DesktopMouseY() > WindowY(#Window_0) + WindowHeight(#Window_0)
  ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,100) 
 Else
  ResizeWindow(#Window_0,#PB_Ignore,#PB_Ignore,#PB_Ignore,200) 
 EndIf 

 Select EventID 
  
  
 EndSelect 
  
Until EventID = #PB_Event_CloseWindow

Publié : ven. 29/févr./2008 9:54
par Ar-S
Excellent ces petits codes, ça va bien me servir :)

Publié : ven. 29/févr./2008 12:29
par lionel_om
Par contre la fenêtre peut être réduite, donc faut aussi tester si la fenêtre est affichée ou réduite...
Du moins si des traitements spéciaux sont à prendre en compte

Lio :wink:

Publié : ven. 29/févr./2008 16:09
par venom
oui c'est pas mal non plus Kwai chang caine :wink: sa evite de crée une procedure et un timer.bien jouer



@++

Publié : ven. 29/févr./2008 16:28
par beauregard
Kwai chang caine a écrit :

Code : Tout sélectionner

 Delay(10)
merci :) bien pratique cette commande ExamineDesktops...
par contre pour un jeu ou tout autre opération graphique, la commande Delay est à bannir...

Publié : ven. 29/févr./2008 18:31
par Kwai chang caine
par contre pour un jeu ou tout autre opération graphique, la commande Delay est à bannir...
Je ne savais pas, il faut dire que je ne fais jamais de jeu, je suis serieux moi :lol:

Le bleme c'est que si on met pas un delay, j'ai l'impression que ça occupe pas mal le proce, a cause du windowevent()
Etant donné qu'avec ça il attend pas une action la boucle tourne tout le temps.
Mais si on met un waitwindowevent alors la ça marche plus, car comme il attend un evenement fenetre et qu'on est plus dedans, il peux toujours attendre :D
En attendant chez moi ça tourne, quand j'aurais changé trois fois mon proce, peut etre que j'installerais un timer :lol: