Seite 1 von 1
Maus über Gadget ?
Verfasst: 04.09.2009 12:43
von Thatsanee
Hi,
hab gleich noch ne Frage.
Wie kann ich rauskriegen über welchem Gadget die der Mauszeiger gerade
befindet, ohne erst eine Taste zu drücken ?
Thatsanee
Verfasst: 04.09.2009 12:54
von Rokur
Frage in der Hauptschleife bei jedem Durchlauf die Koordinaten der Maus ab (WindowMouseX() und WindowMouseY()) und prüfe ob diese innerhalb der Gadget-Koordinaten liegen (MausX >= GadgetX und MausX <= GadgetX+GadgetBreite und MausY >= GadgetY und MausY <= GadgetY+GadgetHöhe).
Verfasst: 04.09.2009 14:35
von Rokur
Hab da mal was gebastelt:
Code: Alles auswählen
EnableExplicit
Enumeration 0 Step 1 ;Gadgets, zur Verdeutlichung explizit nummeriert
#Start ;kein Gadget, dient nur als Startwert der Aufzählung
#btnOk
#btnCancel
#txtInfo
#strGadget
#chk1
#chk2
#opt1
#opt2
#cal
#Ende ;kein Gadget, dient nur als Endwert der Aufzählung
EndEnumeration
OpenWindow(0,0,0,400,400,"Gadget unter der Maus",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
ButtonGadget(#btnOk, 5, 370, 80, 20, "OK")
ButtonGadget(#btnCancel, 90, 370, 80, 20, "Abbrechen")
TextGadget(#txtInfo, 5, 5, 130, 20, "Gadget unter der Maus: ")
StringGadget(#strGadget, 140, 5, 255, 20, "", #PB_String_ReadOnly)
CheckBoxGadget(#chk1, 210, 30, 80, 20, "Test 1")
CheckBoxGadget(#chk2, 210, 50, 80, 20, "Test 2")
OptionGadget(#opt1, 5, 220, 80, 20, "Option 1") : SetGadgetState(#opt1,1)
OptionGadget(#opt2, 5, 240, 80, 20, "Option 2")
CalendarGadget(#cal, 5, 30, 200, 180, Date())
Procedure ShowGadget()
Protected i, x, y, gefunden, text.s
gefunden = #False
x = WindowMouseX(0)
y = WindowMouseY(0)
text = ""
;alle Gadgets durchlaufen
For i = #Start+1 To #Ende-1
;prüfen ob sich die Maus über dem Gadget befindet
If x >= GadgetX(i) And x <= GadgetX(i)+GadgetWidth(i) And y >= GadgetY(i) And y <= GadgetY(i)+GadgetHeight(i)
text + Str(i)
Select i
Case #btnOk
text + " = OK-Knopf"
Case #btnCancel
text + " = Abbrechen-Knopf"
Case #cal
text + " = Der Kalender"
Case #chk1, #chk2
text + " = eine der Checkboxen"
Default
text + " = Namenloses Gadget"
EndSelect
gefunden = #True
EndIf
SetGadgetText(#strGadget,text)
Next i
EndProcedure
Repeat
Define event.l = WaitWindowEvent()
While event ;restliche Events in der Queue verarbeiten, bevor ShowGadget() aufgerufen wird
Select event
Case #PB_Event_CloseWindow
End
EndSelect
event = WindowEvent()
Wend
ShowGadget()
ForEver
Verfasst: 04.09.2009 14:43
von Kaeru Gaman
für Gadgets vielleicht doch etwas oversized?
... meines Wissens wird ein MouseOver von der Windows-GUI schon als Event behandelt... oder nicht?
vielleicht mal im API forum fragen...
Verfasst: 04.09.2009 16:06
von HeX0R
Code: Alles auswählen
EnableExplicit
Enumeration
#btnOk
#btnCancel
#txtInfo
#strGadget
#chk1
#chk2
#opt1
#opt2
#cal
#Ende ;kein Gadget, dient nur als Endwert der Aufzählung
EndEnumeration
OpenWindow(0, 0, 0, 400, 400, "Gadget unter der Maus", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
CreateStatusBar(0, WindowID(0))
ButtonGadget(#btnOk, 5, 350, 80, 20, "OK")
ButtonGadget(#btnCancel, 90, 350, 80, 20, "Abbrechen")
TextGadget(#txtInfo, 5, 5, 130, 20, "Gadget unter der Maus: ")
StringGadget(#strGadget, 140, 5, 255, 20, "", #PB_String_ReadOnly)
CheckBoxGadget(#chk1, 210, 30, 80, 20, "Test 1")
CheckBoxGadget(#chk2, 210, 50, 80, 20, "Test 2")
OptionGadget(#opt1, 5, 220, 80, 20, "Option 1") : SetGadgetState(#opt1, 1)
OptionGadget(#opt2, 5, 240, 80, 20, "Option 2")
CalendarGadget(#cal, 5, 30, 200, 180, Date())
Procedure main()
Protected Gadget, CursorPos.POINT
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_MOUSEMOVE
GetCursorPos_(@CursorPos)
Gadget = #Null
If MapWindowPoints_(0, WindowID(0), @CursorPos, 1)
Gadget = ChildWindowFromPoint_(WindowID(0), PeekQ(@CursorPos))
If Gadget = WindowID(0)
Gadget = 0
EndIf
If Gadget
StatusBarText(0, 0, "Gadget# " + Str(GetDlgCtrlID_(Gadget)))
EndIf
EndIf
If Not Gadget
StatusBarText(0, 0, "")
EndIf
EndSelect
ForEver
EndProcedure
main()
Verfasst: 04.09.2009 19:28
von Thatsanee
Hi,
danke danke....
Sowas was HeXOR gemacht hat schwebte mir vor, also gleich einbauen ...
Schade geht nicht.
Irgendwie werden die Gadget die auf einem PanelGadget und in einem
ScrollAreaGadget sind garnicht erkannt.
Thatsanee
Verfasst: 04.09.2009 19:32
von ts-soft
Verfasst: 04.09.2009 19:51
von Donald
Hi,
ich mache sowas immer mit einer CallBack.
Code: Alles auswählen
Procedure WindowCallBack(hwnd, msg, wParam, lParam)
ReturnValue = #PB_ProcessPureBasicEvents
Select wParam
Case GadgetID(1)
; Deine Anweisung
Case GadgetID(2)
; Deine Anweisung
;
; usw.
;
Default
Debug wParam ; Zeigt alle GadgetIDs an.
EndSelect
ProcedureReturn ReturnValue
EndProcedure
; Aktivieren mit
SetWindowCallback(@WindowCallBack())
Gruß Donald
Verfasst: 04.09.2009 19:58
von mk-soft
Ist schon etwas länger her
Code: Alles auswählen
Structure udtPoint
StructureUnion
pos.Point
value.q
EndStructureUnion
EndStructure
*hWin.long = OpenWindow(#PB_Any,#PB_Ignore,#PB_Ignore,640,480,"",#WS_SYSMENU|#WS_SIZEBOX)
CreateGadgetList(*hWin\l)
ButtonGadget(0,10,10,100,100,"Blub1")
ButtonGadget(1,10,110,100,100,"Blub2")
CreateStatusBar(0,*hWin\l)
AddStatusBarField(90)
Repeat
uMsg = WaitWindowEvent()
If #WM_MOUSEMOVE = uMsg
x = DesktopMouseX()
y = DesktopMouseY()
Select WindowFromPoint_(y<<32 | x)
Case GadgetID(0)
StatusBarText(0, 0, "Blub1")
Case GadgetID(1)
StatusBarText(0, 0, "Blub2")
Default
StatusBarText(0, 0, Str(x) + ":" + Str(y))
EndSelect
EndIf
Until uMsg = #WM_CLOSE
FF
