Seite 1 von 1

API-Funktionen PtInRect_ und GetDlgCtrlID_ funkt. nicht

Verfasst: 07.03.2009 09:48
von dysti
Die API-Funktionen PtInRect_ und GetDlgCtrlID_ funktionieren in PB4.3 nicht.
Fehlermeldung: Falsche Parameterzahl
Unter 4.02 geht es einwandfrei.
Weiß jemand eine Alternativlösung?

Code: Alles auswählen

Procedure Window()
  If OpenWindow(0, 297, 299, 340, 160, "Mouse",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
    If CreateGadgetList(WindowID(0))
      ScrollAreaGadget(1, 20, 20, 170, 120, 340, 240, 10)   
      ButtonGadget(2, 20, 25, 100, 25, "Button 1")
      TextGadget(3, 20, 70, 100, 15, "Text gadget 1")
      CloseGadgetList()
      ButtonGadget(4, 210, 50, 100, 25, "Button 2")     
      TextGadget(5, 210, 90, 100, 15, "Text gadget 2")
    EndIf
  EndIf
EndProcedure
Window()

hCurHand = LoadCursor_(0,#IDC_HAND)
hCurArrow = LoadCursor_(0,#IDC_ARROW)
Repeat 
  Event = WaitWindowEvent() 
  WindowID = EventWindow() 
  GadgetID = EventGadget() 
  EventType = EventType() 
  Select Event
    Case #WM_MOUSEMOVE
      GetCursorPos_(@cp.POINT)
      GetWindowRect_(GadgetID(1), @sa.RECT)
      If PtInRect_(sa, cp\x,cp\y)
        MapWindowPoints_(0,GetWindow_(GadgetID(1),#GW_CHILD),@cp,1)
        parent = GetWindow_(GadgetID(1),#GW_CHILD)
      Else
        MapWindowPoints_(0, WindowID(0), @cp, 1)
        parent = WindowID(0)
      EndIf
      Select GetDlgCtrlID_(ChildWindowFromPoint_(parent,cp\x,cp\y))
        Case 2
          SetCursor_(hCurHand); work         
        Case 3
          SetCursor_(hCurHand); work
        Case 4
          SetCursor_(hCurHand); Work       
        Case 5
          SetCursor_(hCurHand); Work
      EndSelect
  EndSelect
  If Event = #PB_Event_Gadget         
    If GadgetID = 2
    EndIf 
    If GadgetID = 3     
    EndIf   
  EndIf 
Until Event = #PB_Event_CloseWindow
End 

Verfasst: 07.03.2009 12:58
von c4s
Musst halt aus
> PtInRect_(sa, cp\x, cp\y)
dann
> PtInRect_(sa, cp\x | (cp\y << 32))
machen.
Warum genau weiß ich nicht. Hing glaube ich mit der neuen 64er-
Unterstützung zusammen. Im englischen Forum müsstest du eine Erklärung
finden.

Verfasst: 07.03.2009 13:23
von ts-soft
> Warum genau weiß ich nicht
Weil PB bisher alle APIs als Long übergeben hat. Das reicht ja auch für fast
alles, da alles was nicht Long ist, ist eigentlich ein Pointer (wird ByRef
übergeben).
Die wenigen Sachen, wo eine Structure ByValue übergeben wird, wurden
damals einfach in 2 Parameter aufgeteilt. Das kann so mit 64-Bit nicht
gehen.
Diese Specialfälle werden jetzt gesondert behandelt (die meisten, der Rest
geht einfach nicht :mrgreen: )

Verfasst: 07.03.2009 15:58
von edel
Hat mit GetDlgCtrlID aber nichts zu tun.

Verfasst: 07.03.2009 16:01
von Kaeru Gaman
korrekt. das Problem liegt bei ChildWindowFromPoint.

Verfasst: 07.03.2009 16:19
von ts-soft
so siehts dann für PB 4.3 aus:

Code: Alles auswählen

Procedure Window()
  If OpenWindow(0, 297, 299, 340, 160, "Mouse",  #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
;    If CreateGadgetList(WindowID(0))
      ScrollAreaGadget(1, 20, 20, 170, 120, 340, 240, 10)   
      ButtonGadget(2, 20, 25, 100, 25, "Button 1")
      TextGadget(3, 20, 70, 100, 15, "Text gadget 1")
      CloseGadgetList()
      ButtonGadget(4, 210, 50, 100, 25, "Button 2")     
      TextGadget(5, 210, 90, 100, 15, "Text gadget 2")
;    EndIf
  EndIf
EndProcedure
Window()

hCurHand = LoadCursor_(0,#IDC_HAND)
hCurArrow = LoadCursor_(0,#IDC_ARROW)
Repeat
  Event = WaitWindowEvent()
  WindowID = EventWindow()
  GadgetID = EventGadget()
  EventType = EventType()
  Select Event
    Case #WM_MOUSEMOVE
      GetCursorPos_(@cp.POINT)
      GetWindowRect_(GadgetID(1), @sa.RECT)
      If PtInRect_(sa, cp\x | (cp\y << 32))
        MapWindowPoints_(0,GetWindow_(GadgetID(1),#GW_CHILD),@cp,1)
        parent = GetWindow_(GadgetID(1),#GW_CHILD)
      Else
        MapWindowPoints_(0, WindowID(0), @cp, 1)
        parent = WindowID(0)
      EndIf
      Select GetDlgCtrlID_(ChildWindowFromPoint_(parent, cp\x | (cp\y << 32)))
        Case 2
          SetCursor_(hCurHand); work         
        Case 3
          SetCursor_(hCurHand); work
        Case 4
          SetCursor_(hCurHand); Work       
        Case 5
          SetCursor_(hCurHand); Work
      EndSelect
  EndSelect
  If Event = #PB_Event_Gadget         
    If GadgetID = 2
    EndIf
    If GadgetID = 3     
    EndIf   
  EndIf
Until Event = #PB_Event_CloseWindow
End 

Verfasst: 07.03.2009 16:24
von Kaeru Gaman
ermn... das <<32, gilt das auch für x86?
oder müßte es da nicht <<16 heißen?

[edit]
hups ne, sorry... POINT besteht ja aus 2 Longs... maukai!

Verfasst: 07.03.2009 16:27
von ts-soft
Kaeru Gaman hat geschrieben:ermn... das <<32, gilt das auch für x86?
oder müßte es da nicht <<16 heißen?

[edit]
hups ne, sorry... POINT besteht ja aus 2 Longs... maukai!
Die Structure POINT ist immer gleich Groß (acht)

Code: Alles auswählen

Debug SizeOf(POINT)