Seite 1 von 1

PB 4.3 und WindowFromPoint

Verfasst: 27.03.2009 21:20
von hjbremer
Für alle die 32 Bit Programme schreiben und auch in nächster Zukunft schreiben wollen.

Die Parameter Umstellung für WindowFromPoint nervt mich etwas.

im englischen Forum habe ich nun folgendes gesehen:
anstatt

Code: Alles auswählen

hndl=WindowFromPoint_(cursor\y<<32|cursor\x)
kann man auch

Code: Alles auswählen

hndl=WindowFromPoint_(PeekQ(@cursor))
nehmen

Democode aus dem englischen Forum:

Code: Alles auswählen

Procedure.l EventHoverGadget() 
Protected cursor.POINT,hndl.l 
  GetCursorPos_(cursor.POINT) 
  hndl=WindowFromPoint_(PeekQ(@cursor))
  If hndl 
   hndl=GetDlgCtrlID_(hndl) 
   If hndl 
    ProcedureReturn hndl 
   EndIf 
  EndIf 
  
ProcedureReturn 0 
EndProcedure 

OpenWindow(1,0,0,400,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

ButtonGadget(1,10,10,380,20,"Button 1") ;Please note that the first gadgetid start with 1 
ButtonGadget(2,10,30,380,20,"Button 2") 

hover=0 
oldhover=hover 
Repeat 
 event=WindowEvent() 
 Select event 
  Case #WM_MOUSEMOVE 

   hover=EventHoverGadget() 
   If hover<>oldhover 
    Select hover 
     Case 1 : SetGadgetText(1,"Hover") 
     Case 2 : SetGadgetText(2,"Hover") 
    EndSelect 
    Select oldhover 
     Case 1 : SetGadgetText(1,"Button 1") 
     Case 2 : SetGadgetText(2,"Button 2") 
    EndSelect 
    oldhover=hover 
   EndIf 

 EndSelect 
 Delay(1) 
Until event = #PB_Event_CloseWindow
und nun hab ich mir gedacht, wenn es denn ein 64 Bit Wert sein soll/muß, egal wie der zustande kommt, dann kann man es auch so machen wie früher in der guten alten Zeit. Hat schon Opa gesagt :D

Mein alter Freund heißt Import:

Code: Alles auswählen

Import "USER32.lib"
 WindowFromPoint32_(a.l,b.l) As "_WindowFromPoint"
EndImport

Procedure.l EventHoverGadget() 
Protected cursor.POINT,hndl.l 
  GetCursorPos_(cursor.POINT) 
  hndl=WindowFromPoint32_(cursor\x,cursor\y) 
  If hndl 
   hndl=GetDlgCtrlID_(hndl) 
   If hndl 
    ProcedureReturn hndl 
   EndIf 
  EndIf 
  
ProcedureReturn 0 
EndProcedure 

OpenWindow(1,0,0,400,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

ButtonGadget(1,10,10,380,20,"Button 1") ;Please note that the first gadgetid start with 1 
ButtonGadget(2,10,30,380,20,"Button 2") 

hover=0 
oldhover=hover 
Repeat 
 event=WindowEvent() 
 Select event 
  Case #WM_MOUSEMOVE 

   hover=EventHoverGadget() 
   If hover<>oldhover 
    Select hover 
     Case 1 : SetGadgetText(1,"Hover") 
     Case 2 : SetGadgetText(2,"Hover") 
    EndSelect 
    Select oldhover 
     Case 1 : SetGadgetText(1,"Button 1") 
     Case 2 : SetGadgetText(2,"Button 2") 
    EndSelect 
    oldhover=hover 
   EndIf 

 EndSelect 
 Delay(1) 
Until event = #PB_Event_CloseWindow
und siehe da, alles ist wie man es kennt :mrgreen:

Verfasst: 27.03.2009 21:34
von ts-soft
Die vorherige Form war ja ein Notlösung, weil PB kein POINT ByVal
übergeben konnte, laut MSDN ist es nur ein Parameter, da wäre es blöd,
wenn man die alte Schreibweise beibehält, ist ja wie nie Updaten wollen :mrgreen:

Verfasst: 27.03.2009 21:46
von hjbremer
aber das hier ist ja wohl noch blöder

Code: Alles auswählen

cursor\y<<32|cursor\x
da kriegen ja andere "Sprachen" einen Lachkoller :lol: :lol: :lol:

Verfasst: 27.03.2009 21:47
von Kaeru Gaman
man kann StructureUnion benutzen um einen Container zu bauen...

Code: Alles auswählen

Structure ValPoint
  StructureUnion
    P.POINT
    V.q
  EndStructureUnion
EndStructure

Define CheckPoint.ValPoint

CheckPoint\P\x = 384
CheckPoint\P\x = 256

hWnd = WindowFromPoint_( CheckPoint\V )

Verfasst: 27.03.2009 23:33
von hjbremer
sehr gute Idee, wenn schon modern,

dann also so:

Code: Alles auswählen

Structure Point64 
  StructureUnion 
    p.POINT 
    q.q 
  EndStructureUnion 
EndStructure 

Procedure.l EventHoverGadget() 

  GetCursorPos_(cursor.POINT64) 
   
  hndl = WindowFromPoint_( cursor\q )
  If hndl 
   hndl=GetDlgCtrlID_(hndl) 
   If hndl 
    ProcedureReturn hndl 
   EndIf 
  EndIf 
  
ProcedureReturn 0 
EndProcedure 

OpenWindow(1,0,0,400,100,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu) 

ButtonGadget(1,10,10,380,20,"Button 1") ;Please note that the first gadgetid start with 1 
ButtonGadget(2,10,30,380,20,"Button 2") 

hover=0 
oldhover=hover 
Repeat 
 event=WindowEvent() 
 Select event 
  Case #WM_MOUSEMOVE 

   hover=EventHoverGadget() 
   If hover<>oldhover 
    Select hover 
     Case 1 : SetGadgetText(1,"Hover") 
     Case 2 : SetGadgetText(2,"Hover") 
    EndSelect 
    Select oldhover 
     Case 1 : SetGadgetText(1,"Button 1") 
     Case 2 : SetGadgetText(2,"Button 2") 
    EndSelect 
    oldhover=hover 
   EndIf 

 EndSelect 
 Delay(1) 
Until event = #PB_Event_CloseWindow

Verfasst: 27.03.2009 23:37
von Kaeru Gaman
geht denn das überhaupt:

Code: Alles auswählen

GetCursorPos_(cursor.POINT64) 
ich würde jetzt erstmal denken, dass man cursor\q übergeben muss....

Verfasst: 28.03.2009 00:28
von hjbremer
ja das geht wohl, denn Beispielcode funkt.

und da ich ein fauler S... bin, stopfe ich das in eine Residentdatei.
incl. ein paar anderer Sachen die ich brauche

Code: Alles auswählen

;HJBremers Resident Datei

;als myres.pb im Ordner \PureBasic430\Compilers abspeichern
;Eingabeaufforderung aufrufen und ins obige Verzeichnis wechseln
;pbcompiler myres.pb /resident myres.res eingeben
;dann das Ergebnis myres.res ins Resident Verzeichnis kopieren
;PB beenden und neu starten
;die Strukturen werden jetzt in Werkzeuge-Strukturverzeichnis aufgelistet
;und die Makros stehen als neue Befehle zur Verfügung incl. Kurzinfo in der IDE

;wenn diese myres.res geändert werden soll, muß diese vor Aufruf von pbcompiler...
; aus dem Resident Verzeichnis gelöscht werden !

Macro MakeLong(low, high) 
  low | (high<<16) 
EndMacro

Macro LowWord(Value) 
  Value & $FFFF 
EndMacro 

Macro HighWord(Value) 
  (Value >> 16) & $FFFF 
EndMacro 

Structure char_array
  c.c[0]
EndStructure

Structure strg_array
  s.s{1}[0]
EndStructure

;von Kaeru Gaman
Structure Point64 
  StructureUnion 
    p.POINT 
    q.q 
  EndStructureUnion 
EndStructure

PS: die Erklärung ist mehr für mich, weil ichs immer vergesse, besonders das Löschen

Verfasst: 28.03.2009 00:37
von Kaeru Gaman
> ja das geht wohl, denn Beispielcode funkt.

aha.... ist ja interessant.
wahrscheinlich, weils ne API funktion ist die sowieso nen Pointer zu ner Struct erwartet, keinen Wert.

für mich käme so eine Vorgehensweise weniger in Frage, weil ich sowieso
bei allen codes die länger als vierzig Zeilen sind EnableExplicit benutze... ;)

Re: PB 4.3 und WindowFromPoint

Verfasst: 05.07.2011 17:52
von Frabbing
aha.... ist ja interessant.
wahrscheinlich, weils ne API funktion ist die sowieso nen Pointer zu ner Struct erwartet, keinen Wert.
Und woher nimmst du deine falschen Infos? Bei MSDN steht nichts darüber, das es ein Pointer ist. Vielmehr ist es die Struktur selber, sind also zwei Parameter. PureBasic hat diese WindowFromPoint demnach eigentlich falsch deklariert.

Re: PB 4.3 und WindowFromPoint

Verfasst: 06.07.2011 13:19
von bobobo
ui .. ein Leichenschänder :D

KG s letzter Eintrag ist vom 8. Mai 2010 12:22, seitdem hält der Frosch offiziell Funkstille