PB 4.3 und WindowFromPoint

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

PB 4.3 und WindowFromPoint

Beitrag 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:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
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 »

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:
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
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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 )
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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... ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: PB 4.3 und WindowFromPoint

Beitrag 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.
Gruß, Frank
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: PB 4.3 und WindowFromPoint

Beitrag 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
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten