détection souris dans fenetre ou bureau

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

détection souris dans fenetre ou bureau

Message 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 :? .



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message 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
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message 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 ?



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message 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.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message 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
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message 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: .


@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message 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 ?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Message par Ar-S »

Excellent ces petits codes, ça va bien me servir :)
~~~~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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message 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



@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message 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...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
Répondre