API-Funktionen PtInRect_ und GetDlgCtrlID_ funkt. nicht

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

API-Funktionen PtInRect_ und GetDlgCtrlID_ funkt. nicht

Beitrag 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 
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag 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.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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: )
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Hat mit GetDlgCtrlID aber nichts zu tun.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

korrekt. das Problem liegt bei ChildWindowFromPoint.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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!
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten