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 :wink: