[MaxGUI] Absolute Mausposition - Tabber Problem

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Noa

Betreff: [MaxGUI] Absolute Mausposition - Tabber Problem

BeitragMo, März 08, 2010 9:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo allerseits ^^,

ich hätte da gerne mal ein Problem und zwar folgendes:

Habe per MaxGUI ein Fenster erstellt.
-> Dieses Fenster enthält einen Tabber.
-> Dieser Tabber wiederum enthält ein Panel.
Wenn nun ein EVENT_MOUSEDOWN und ein darauf folgendes EVENT_MOUSEMOVE auf diesem Panel erzeugt wird, brauche ich davon die x, y Koordinaten, relativ zum Fenster und nicht zum Panel.

Ich habe das bisher so versucht zu lösen, dass ich vom TGadget des Panels aus über GadgetGroup() nach oben aufgestiegen bin bis zum Fenster und jeweils die GadgetX() bzw. GadgetY() addiert habe.
Bei einem normalen Panel funktioniert das, nun liegt leider das Panel in einem Tabber und der hat zwar eine Position aber das ist leider nicht die Position des Inhaltsbereichs des Tabbers, sondern die Position der Tab-Leiste. Da das darunterliegende Panel sich aber am Inhaltsbereich ausrichtet, fehlen mir bei der Positionsberechnung die Pixel zwischen Tab-Leiste und Tabber-Inhaltsbereich.

Hat irgendjemand eine Idee für eine Lösung?
Oder eine Möglichkeit wie ich sonst an die "absoluten" Werte des Mouse-Events komme?

Im Voraus vielen Dank für eure Hilfe.
 

klepto2

BeitragMo, März 08, 2010 10:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Unter Windows kannst du es so machen:

Code: [AUSKLAPPEN]

   Case EVENT_MOUSEMOVE
         Local P:Int[2]
         GetCursorPos_(P)
         Print P[0] + ";" + P[1]


Wie es unter den anderen Betriebssystemen aussieht kann ich nicht sagen, da müssen die Mac und Linux Gurus ran Wink
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Noa

BeitragMo, März 08, 2010 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Wunderbar, wenn ich davon die x, y des Hauptfensters abziehe funktioniert es unter Windows.
Dank dir klepto2 ^^

Jetz hoff ich natürlich, dass auch noch jemand was zu Linux / MacOS sagen kann.

Noa

BeitragDi, März 09, 2010 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Nachtrag: Leider musste ich feststellen, dass die absolute Maus-Position nicht genügt, muss auch irgendwie die absolute Position des Gadgets errechnen können, mit dem oben genannten Problem.

Irgendwelche Ideen?

Im Voraus danke ^^
 

klepto2

BeitragDi, März 09, 2010 23:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank etwas mehr Zeit habe ich noch folgende Lösung:

Code: [AUSKLAPPEN]

' createbutton.bmx

Import MaxGui.Drivers

Strict

Global window:TGadget = CreateWindow("MaxGUI Buttons",40,40,400,330,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
   CreateButton("Std. Button",10,10,120,30,window,BUTTON_PUSH)
   CreateButton("OK Button",140,10,120,30,window,BUTTON_OK)
   CreateButton("Cancel Button",270,10,120,30,window,BUTTON_CANCEL)

Global panel:TGadget[4]
   panel[0]=CreatePanel(10,50,380,60,window,PANEL_GROUP,"Checkbox")
      FillPanelWithButtons(panel[0], BUTTON_CHECKBOX, "Checkbox")
   panel[1]=CreatePanel(10,120,380,60,window,PANEL_GROUP,"Checkbox (with Push Button Style)")
      FillPanelWithButtons(panel[1], BUTTON_CHECKBOX|BUTTON_PUSH, "Toggle")
   panel[2]=CreatePanel(10,190,380,60,window,PANEL_GROUP,"Radio Buttons")
      FillPanelWithButtons(panel[2], BUTTON_RADIO, "Option ")
   panel[3]=CreatePanel(10,260,380,60,window,PANEL_GROUP,"Radio Buttons (with Push Button Style)")
      FillPanelWithButtons(panel[3], BUTTON_RADIO|BUTTON_PUSH, "Option")

Repeat
   Select WaitEvent()
      Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
         End
      Case EVENT_GADGETACTION
         Print "EVENT_GADGETACTION~n" + ..
         "GadgetText(): ~q" + GadgetText(TGadget(EventSource())) + "~q ~t " + ..
         "ButtonState(): " + ButtonState(TGadget(EventSource() ) )
         Local p:Int[] = GadgetAbsolutePosition(TGadget(EventSource() ) )
         Print "Abs Position: " + p[0] + ";" + p[1]
         p=RelativeToAbsolutePosition(TGadget(EventSource() ),20,20 )
         Print "Abs(20,20) Position: " + p[0] + ";" + p[1]
   EndSelect
Forever

Function FillPanelWithButtons( pPanel:TGadget, pStyle%, pText$ = "Button" )
   Local buttonwidth% = (pPanel.width-10)/3
   For Local i% = 0 Until 3
      CreateButton( pText + " " + (i+1), 5+(i*buttonwidth), 5, buttonwidth-10, 26, pPanel, pStyle )
   Next
EndFunction

Function GadgetAbsolutePosition:Int[](gadget:TGadget)
   Local hwnd:Int = QueryGadget(gadget , QUERY_HWND)
   Local p:Int[] = [GadgetX(gadget) , GadgetY(gadget)]
   ClientToScreen(hwnd , p)
   Return p
End Function

Function RelativeToAbsolutePosition:Int[](gadget:TGadget,X:Int,Y:Int)
   Local hwnd:Int = QueryGadget(gadget , QUERY_HWND)
   Local p:Int[] = [X , Y]
   ClientToScreen(hwnd , p)
   Return p
End Function


Einfach mal die Buttons klicken und den Output anschauen. Auch mal das Fenster verschieben.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Noa

BeitragDi, März 09, 2010 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist genial. Danke vielmals ^^
Von dieser ClientToScreen() Funktion hab ich nirgens etwas gelesen. Aber da die scheinbar aus pub.win32 stammt wird das ganze wahrscheinlich nur unter Windows laufen, oder?

Jedenfalls nochmals vielen Dank, nun kann ich endlich weiterarbeiten ^^

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group