Pointer ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Invité

Pointer ?

Message 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.
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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
Dernière modification par nico le ven. 13/févr./2004 8:24, modifié 2 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

euh... WindowMouseX() et WindowMouseY()... lol :P
Invité

Message par Invité »

Cedravic,

euh.....c'est pas du tout pareil, mais je te laisse découvrir pourquoi! :wink:
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

ben tu fait WindowMouseX() - la taille de la bordure 8)
Répondre