Page 1 sur 1

Pointer ?

Publié : jeu. 12/févr./2004 23:15
par Invité
Soit le code suivant:

Code : Tout sélectionner

Procedure WindowClientMouse(win.l)
  If  GetCursorPos_(@mouse.POINT) 
    If ScreenToClient_(win,@mouse) 
      ProcedureReturn @mouse
    EndIf        
  EndIf 
EndProcedure 

window.l=OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu,"Aera client Mouse move") 
CreateGadgetList(WindowID()) 
TextGadget(0,4,4,192,20,"") 

Repeat 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Quit=1 
    Case #WM_MOUSEMOVE 
      *coordinate.POINT=WindowClientMouse(window)
      mouseX.l=*coordinate\x
      mouseY.l=*coordinate\y
      SetGadgetText(0,"MouseX: "+Str( mouseX)+", MouseY:"+Str(mouseY)) 
  EndSelect 
Until Quit = 1 
End
Pourquoi si je remplace:

mouseX.l=*coordinate\x
mouseY.l=*coordinate\y
SetGadgetText(0,"MouseX: "+Str( mouseX)+", MouseY:"+Str


par ceci:

SetGadgetText(0,"MouseX: "+Str( *coordinate\x)+", MouseY:"+Str( *coordinate\y))

Cela ne fonctionne plus!! 8O :roll:

Merci d'avance pour vos réponses.

Publié : ven. 13/févr./2004 0:20
par filperj
8O Ta proc retourne un pointeur vers une variable locale !!!
Ca veut dire qu'au moment où cette addresse est retournée, la location en mémoire de la variable cesse d'être réservée(puisque la proc qui l'avait réservée s'est terminée), donc ensuite elle peut être réutilisée n'importe quand pour n'importe quelles données (par ex les variables locales de la prochaine fonction appelée).
Plutôt que de longs discours, voilà une version plus "stable":

Code : Tout sélectionner

Procedure WindowClientMouse(win.l,*mousereceptacle.POINT)
  If  GetCursorPos_(@mouse.POINT)
    If ScreenToClient_(win,@mouse)
      CopyMemory(@mouse,*mousereceptacle,SizeOf(POINT));au lieu de retourner un pointeur
    EndIf                                                 ;on inscrit les données
  EndIf                                                    ;là où on les attend
EndProcedure

window.l=OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu,"Aera client Mouse move")
CreateGadgetList(WindowID())
TextGadget(0,4,4,192,20,"")

Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Quit=1
    Case #WM_MOUSEMOVE
      WindowClientMouse(window,@coordinate.POINT)
       SetGadgetText(0,"MouseX: "+Str( coordinate\x)+", MouseY:"+Str( coordinate\y))
  EndSelect
Until Quit = 1
End

Tu saisis l'idée ? :wink:

Publié : ven. 13/févr./2004 1:24
par nico
Je saisi, mais j'ai toujours un peu de mal....

Est ce que ça c'est correct, ça l'air de bien fonctionner.

Code : Tout sélectionner

Procedure WindowClientMouse(win.l,*mouse.POINT) 
  If  GetCursorPos_(*mouse) 
    If ScreenToClient_(win,*mouse) 
      ProcedureReturn 1 
    EndIf 
  EndIf 
EndProcedure 

window.l=OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu,"Aera client Mouse move") 
CreateGadgetList(WindowID()) 
TextGadget(0,4,4,192,20,"") 

Repeat 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Quit=1 
    Case #WM_MOUSEMOVE 
            If WindowClientMouse(window,@coordinate.POINT ) 
        SetGadgetText(0,"MouseX: "+Str( coordinate\x)+", MouseY:"+Str(coordinate\y)) 
      EndIf 
  EndSelect 
Until Quit = 1 
End

Publié : ven. 13/févr./2004 2:37
par cederavic
euh... WindowMouseX() et WindowMouseY()... lol :P

Publié : ven. 13/févr./2004 3:09
par Invité
Cedravic,

euh.....c'est pas du tout pareil, mais je te laisse découvrir pourquoi! :wink:

Publié : ven. 13/févr./2004 5:25
par filperj
Le soucis avec windowmouseX()/Y(), c'est qu'elles renvoient les coordonnées par rapport au coin de la fenêtre bordures comprises, alors que ce qui t'intéresse c'est les coordonnées par rapport à la zone intérieure.
Le Soldat Inconnu avait posté un truc pour corriger :
http://purebasic.hmt-forum.com/viewtopic.php?t=49
Mais ta méthode marche aussi (ton 2e code m'a l'air au poil :wink: )
Je sais pas si y en a une mieux que l'autre :roll:

Publié : ven. 13/févr./2004 12:25
par cederavic
ben tu fait WindowMouseX() - la taille de la bordure 8)