Problème handle de l'API WindowFromPoint avec les TextGadget

Archive.
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Problème handle de l'API WindowFromPoint avec les TextGadget

Message par Lna »

Bonjour,

Au passage de la souris, l'API WindowFromPoint_ ne retourne pas les handles des TextGadgets lorsque ceux-ci appartiennent à la même fenêtre.

Si on lance 2 fois ce programme, chaque programme détecte parfaitement le TextGadget de l'autre, mais pas les leurs.

Code : Tout sélectionner

; PB 4.00

Enumeration 
  #Window_0 
EndEnumeration 

CurPos.POINT 

hWnd=OpenWindow(#Window_0,300,200,350,80,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget,0) 
CreateGadgetList(hWnd) 

handle_1=TextGadget(1,200,25,200,25,"TEST TEXTGADGET")
handle_2=ButtonGadget(2,10,25,150,25,"TEST BOUTON")

SetGadgetText(1,"TEST TEXTGADGET "+Str(handle_1))
SetGadgetText(2,"TEST BOUTON "+Str(handle_2))

SetTimer_(hWnd,1,50,0) 

Repeat 
  GetCursorPos_(CurPos)

  Handle = WindowFromPoint_(CurPos\x,CurPos\y)
  x_mouse_screen=CurPos\x
  y_mouse_screen=CurPos\y
  
  ScreenToClient_(handle,@CurPos)
  x_mouse_gadget=CurPos\x
  y_mouse_gadget=CurPos\y
  
  Select WaitWindowEvent() 
    Case #WM_TIMER
      SetWindowTitle(#Window_0,"HANDLE"+Str(Handle)+" MOUSE= ["+Str(x_mouse_screen)+" "+Str(y_mouse_screen)+"] ["+Str(x_mouse_gadget)+" "+Str(y_mouse_gadget)+"]") 
    Case #PB_Event_CloseWindow 
      KillTimer_(hWnd,1)
      End
  EndSelect 
ForEver
Testé sur les 2 Win 98 1 et SE.

Merci de regarder.

A +
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Sous Windows XP ça fait pareil, il faut utiliser l'API ChildWindowFromPoint_

Code : Tout sélectionner

; PB 4.00

Enumeration
     #Window_0
EndEnumeration

CurPos.POINT

hwnd=OpenWindow(#Window_0,300,200,350,200,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget,0)
CreateGadgetList(hwnd)

handle_1=TextGadget(1,200,25,200,25,"TEST TEXTGADGET")
handle_2=ButtonGadget(2,10,25,150,25,"TEST BOUTON")

SetGadgetText(1,"TEST TEXTGADGET "+Str(handle_1))
SetGadgetText(2,"TEST BOUTON "+Str(handle_2))

SetTimer_(hwnd,1,50,0)

Repeat
     GetCursorPos_(CurPos)
     
     Handle = WindowFromPoint_(CurPos\x,CurPos\y)
     
     ScreenToClient_(Handle,@CurPos)
     x_mouse_gadget=CurPos\x
     y_mouse_gadget=CurPos\y 
     
     Handle2 = ChildWindowFromPoint_(Handle,CurPos\x,CurPos\y)
     
     x_mouse_screen=CurPos\x
     y_mouse_screen=CurPos\y
     
     Select WaitWindowEvent()
          Case #WM_TIMER
               SetWindowTitle(#Window_0,"HANDLE"+Str(Handle)+" MOUSE= ["+Str(x_mouse_screen)+" "+Str(y_mouse_screen)+"] ["+Str(x_mouse_gadget)+" "+Str(y_mouse_gadget)+"]")
               StartDrawing(WindowOutput(#Window_0))
               Box(10,60,330,130,0)
               DrawText(40, 70, "Handle : "+Str(Handle),$FFFFFF,0)
               DrawText(40, 90, "Handle Child : "+Str(Handle2),$FFFFFF,0)
               StopDrawing()
               
          Case #PB_Event_CloseWindow
               KillTimer_(hwnd,1)
               End
     EndSelect
ForEver
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

en plus l'emploi des timer n'est pas indispensable :D

Code : Tout sélectionner

; PB 4.00

Enumeration
  #Window_0
EndEnumeration

CurPos.POINT

hwnd=OpenWindow(#Window_0,300,200,350,200,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget,0)
CreateGadgetList(hwnd)

handle_1=TextGadget(1,200,25,200,25,"TEST TEXTGADGET")
handle_2=ButtonGadget(2,10,25,150,25,"TEST BOUTON")

SetGadgetText(1,"TEST TEXTGADGET "+Str(handle_1))
SetGadgetText(2,"TEST BOUTON "+Str(handle_2))

CallDebugger
Repeat
  GetCursorPos_(CurPos)
  
  Handle = WindowFromPoint_(CurPos\x,CurPos\y)
  
  ScreenToClient_(Handle,@CurPos)
  x_mouse_gadget=CurPos\x
  y_mouse_gadget=CurPos\y
  
  Handle2 = ChildWindowFromPoint_(Handle,CurPos\x,CurPos\y)
  
  x_mouse_screen=CurPos\x
  y_mouse_screen=CurPos\y
  
  event=WaitWindowEvent()
  
  SetWindowTitle(#Window_0,"HANDLE"+Str(Handle)+" MOUSE= ["+Str(x_mouse_screen)+" "+Str(y_mouse_screen)+"] ["+Str(x_mouse_gadget)+" "+Str(y_mouse_gadget)+"]")
  StartDrawing(WindowOutput(#Window_0))
  Box(10,60,330,130,0)
  DrawText(40, 70, "Handle : "+Str(Handle),$FFFFFF,0)
  DrawText(40, 90, "Handle Child : "+Str(Handle2),$FFFFFF,0)
  StopDrawing()
  
Until  event=#PB_Event_CloseWindow

End

Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message par Lna »

Merci pour votre aide.

WindowFromPoint_ retourne bien le handle, cependant ScreenToClient_ avec le bon handle ne retourne pas la position interne du gadget TextGadget.

Ce qui est étrange, c'est qu'en lançant une deuxième fois le programme parallèlement, WindowFromPoint retourne parfaitement le handle du TextGadget de l'autre programme.

Sinon pour ScreenToClient_, il est possible de retrouver les coordonnées par calculs avec GetWindowRect_, ...

Le ButtonGadget fonctionne parfaitement avec les Api.

Code : Tout sélectionner

; PB 4.00

Enumeration
  #Window_0
EndEnumeration

CurPos.POINT

hwnd=OpenWindow(#Window_0,300,200,350,200,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget,0)
CreateGadgetList(hwnd)

handle_1=TextGadget(1,200,25,200,25,"TEST TEXTGADGET")
handle_2=ButtonGadget(2,10,25,150,25,"TEST BOUTON")

SetGadgetText(1,"TEST TEXTGADGET "+Str(handle_1))
SetGadgetText(2,"TEST BOUTON "+Str(handle_2))

SetTimer_(hwnd,1,50,0)

Repeat
  GetCursorPos_(CurPos)
  
  Handle = WindowFromPoint_(CurPos\x,CurPos\y)
  
  ScreenToClient_(Handle,@CurPos)
  x_mouse_gadget=CurPos\x
  y_mouse_gadget=CurPos\y
  
  Handle2 = ChildWindowFromPoint_(Handle,CurPos\x,CurPos\y)
  
  x_mouse_screen=CurPos\x
  y_mouse_screen=CurPos\y
  
  ScreenToClient_(Handle2,@CurPos) ; Rajout
  
  x_mouse_gadget=CurPos\x          ; Rajout
  y_mouse_gadget=CurPos\y          ; Rajout
  
  
  Select WaitWindowEvent()
    Case #WM_TIMER
      SetWindowTitle(#Window_0,"HANDLE"+Str(Handle)+" MOUSE= ["+Str(x_mouse_screen)+" "+Str(y_mouse_screen)+"] ["+Str(x_mouse_gadget)+" "+Str(y_mouse_gadget)+"]")
      StartDrawing(WindowOutput(#Window_0))
      Box(10,60,330,130,0)
      DrawText(40, 70, "Handle : "+Str(Handle),$FFFFFF,0)
      DrawText(40, 90, "Handle Child : "+Str(Handle2),$FFFFFF,0)
      DrawText(40, 110, "HANDLE "+Str(Handle)+" MOUSE= ["+Str(x_mouse_screen)+" "+Str(y_mouse_screen)+"] ["+Str(x_mouse_gadget)+" "+Str(y_mouse_gadget)+"]",$FFFFFF,0) ; Rajout
      
      StopDrawing()
      
    Case #PB_Event_CloseWindow
      KillTimer_(hwnd,1)
      End
  EndSelect
ForEver
Dobro a écrit :en plus l'emploi des timer n'est pas indispensable :D
Le timer dans l'exécution de 2 programmes ne semble pas être inappropriée pour cette démonstration.
Si l'on lance ta version de programme modifié, on peut constater que chaque programme ne permet plus de récupérer les handles des autres programmes. 8O
Ceci dit, il suffit de remplacer WaitWindowEvent() par WindowEvent() + le rajout d'un Delay(100) approprié pour le faire. 8O


Tout dysfonctionnement anodin peut mettre en évidence un autre problème plus sérieux, d'où l'importance de le signaler.

Merci.

A +
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

ChildWindowFromPoint est peut être plus approprié :?:
"Qui baise trop bouffe un poil." P. Desproges
Répondre