Maus über Gadget ?

Anfängerfragen zum Programmieren mit PureBasic.
Thatsanee
Beiträge: 116
Registriert: 11.03.2005 05:12

Maus über Gadget ?

Beitrag 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
Mrs. Thatsanee
PB 4 - PB 3.94
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag 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).
WinXP 32 Bit, PureBasic 4.40 (x86)
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag 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
WinXP 32 Bit, PureBasic 4.40 (x86)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag 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()
Thatsanee
Beiträge: 116
Registriert: 11.03.2005 05:12

Beitrag 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
Mrs. Thatsanee
PB 4 - PB 3.94
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 »

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
Donald
Beiträge: 307
Registriert: 03.01.2005 02:21
Wohnort: Marl

Beitrag 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
DONALD :D www.PureBasic-Donald.de gibt es im Moment nicht mehr
PureBasic - jaPBe - PureVisonXP - TailBite
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten