Seite 1 von 1

Mouseoverfunktion gesucht

Verfasst: 08.09.2013 21:06
von derschutzhund
Hallo zusammen,

in einem Programm habe ich auf verschiedenen Seiten eines Panels mehrere canvas eingebaut.
Nun möchte ich die Mousposition ermitteln wenn ich die Mouse über ein bestimmtes canvas bewege.
Mit #PB_EventType_LeftButtonDown die Position zu ermitteln geht aber es gibt wohl kein #PB_EventType_Mousemove?
Habe zwei Lösungsansätze gefunden aber die verwenden #WM_MOUSEMOVE
Nun ist mir nicht klar, ob das vielleicht ein WindowsEvent ist welches unter Linux oder Mac nicht erzeugt wird?
Da ich das Programm auch für Linux und Mac nutzen möchte suche ich eine allgemein lauffähige Funktion.

EDIT: Habe es gefunden! Hat sich also erledigt!


LG

Wolfgang

Re: Mouseoverfunktion gesucht

Verfasst: 08.09.2013 22:02
von NicTheQuick
Sag doch schnell noch die Lösung, dann hilfst du auch anderen.

Re: Mouseoverfunktion gesucht

Verfasst: 09.09.2013 09:50
von Danilo
NicTheQuick hat geschrieben:Sag doch schnell noch die Lösung, dann hilfst du auch anderen.
Das CanvasGadget hat #PB_EventType_MouseMove, andere Gadgets nicht. ;)
Deshalb stehen einige Events nur beim CanvasGadget, nicht bei EventType().

Re: Mouseoverfunktion gesucht

Verfasst: 09.09.2013 18:22
von derschutzhund
NicTheQuick hat geschrieben:Sag doch schnell noch die Lösung, dann hilfst du auch anderen.
So soll es sein :D

Code: Alles auswählen

   If Event = #PB_Event_Gadget And EventGadget() = Canvas_Kalender ; ----------------- canvas_Kalender routinen ---------
      Select EventType()           
         Case #PB_EventType_MouseMove
            x = GetGadgetAttribute(Canvas_Kalender, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(Canvas_Kalender, #PB_Canvas_MouseY)
            ForEach kalender()            
            If (x >= kalender()\x) And (x <= (kalender()\x+kalender()\width)) And
               (y >= kalender()\y) And (y <= (kalender()\y+kalender()\height))          
               SetGadgetText(String_kalenderinfo,Str(kalender()\TagMon) + " " +Str(kalender()\Monat))
               gewaehlt_tag = kalender()\TagMon
               gewaehlt_mon = kalender()\Monat
             EndIf   
          Next
       Case #PB_EventType_LeftButtonDown
          inhaltname$ = "unterricht_"+ gewaehlt_tag+"_"+gewaehlt_mon+"_"+kalender()\Jahr+".txt"
           If OpenFile(0, inhaltname$) ; öffnet eine existierende Datei oder erstellt eine, wenn sie noch nicht existiert
             CloseFile(0)
           EndIf
          RunProgram(inhaltname$)         
      EndSelect
Erklärung:
Da ich bezüglich Kalender nichts passendes gefunden habe mache ich den jetzt komplett neu.
Ziel ist einen Jahreskalender zu erstellen der sich aus der folgenden Textdatei selbst erstellt.

Code: Alles auswählen

Jahr;2013
Erster Wochentag;2
Tage pro Monat;31;28;31;30;31;30;31;31;30;31;30;31
Ferienwoche;1;1;5
Ferienwoche;25;3;13
Ferienwoche;22;7;44
Ferienwoche;21;10;13
Ferienwoche;23;12;9
Ferientag;9;5
Ferientag;20;5
Ferientag;21;5
Ferientag;3;10
Das ist schon alles fertig und wird auf einem Canvas angezeigt.
Ich kann zu jedem Tag verschiedene Inhalte definieren und auch verschiedene Farben festlegen.
Evtl. möchte ich noch mehrere Infos über das "Tagesfeld" anzeigen und nicht nur eine Farbe.
Die Infos zu jedem Tag werden in folgender Struktur gespeichert:

Code: Alles auswählen

Structure kalend
   Jahr.i             ; Jahr           2013
   WoTag.i            ; Wochentag      1 = Mo
   TagGes.i           ; Tag des Jahres 125
   TagMon.i           ; Tag im Monat   15 
   KW.i               ; Kalenderwoche  20
   Monat.i            ; Monat          3   -> März
   FarbeH.i           ; Hintergr.farbe 65000   
   FarbeT.i           ; Textfarbe      255
   Bemerk.s           ; freier Text    "Praktikumswoche"
   Link.s             ; freier Link    "http:\\www.superhomepage.de"  für internet oder html auf Disk
   markiert.i         ; frei zum Beispiel für den aktuellen Tag
   TagesArt.i         ; z.B 1 = Schultag, 2 = Ferientag, 3 = Feriertag, was es sont soch so gibt..
   
   x.i                ; x-pos im Kalender_canvas
   y.i                ; y-pos im Kalender_canvas
   width.i            ; Breite im  Kalender_canvas
   height.i           ; Länge im  Kalender_canvas

EndStructure
Bei der Erzeugung des Kalenders auf dem Canvas trage ich die x,y,width und height für jeden Tag in die Struktur ein.
Jeder Tag hat also eine Struktur und eine bestimmte Fläche auf dem Canvas.
Vielleicht etwas weit ausgeholt aber vielleicht auch nicht :lol:

Der Code oben ermittelt automatisch die aktuelle Mausposition wenn sich der Cursor über das Canvas_Kalender bewegt.
In der Foreach-Schleife vergleiche ich dann ob die aktuelle Position in einer der Flächen eines Tages ist.
Wenn ja speichere ich den Tag im Feld gewaehlter_Tag und gewaehlter_Mon(at) ab.
Mache ich dann einen Linksklick auf den Tag, dann wird #PB_EventType_LeftButtonDown erzeugt und folgenden Programmzeilen ausgeführt.
Hier versuche ich mit "OpenFile" teste ich ob eine entsprechende "Tagesdatei" vorhanden ist wenn nicht wird eine erzeugt damit der folgende Programmaufruf nicht abbricht sondern die *.txt sofort geladen wird.
Da bin ich noch am testen weil mir ein .txt eigentlich nicht gut genug ist.
Ich hätte gerne auch die Möglichkeit Links im Text zu definieren.
Habe dazu schon Openoffice getestet aber irgendwie dauert mir da der Start zu lange.
Kennt jemand ein einfaches Textprogramm, Freeware welches auch Links im Text ermöglicht und das es evtl. auch für Linux und Mac gibt?

LG

Wolfgang

P.S. Falls so ein Kalender für euch interessant ist könnte ich ihn natürlich zur Verfügung stellen, wenn er komplett fertig ist!

Re: Mouseoverfunktion gesucht

Verfasst: 09.09.2013 18:33
von ts-soft
Das ForEach bei jedem MouseMove ist doch wohl etwas overkill :wink:
Da kocht die CPU :lol:
Das würde ich eher nur bei einem Mouseklick feststellen, wo sich die Mouse befindet.

Re: Mouseoverfunktion gesucht

Verfasst: 09.09.2013 18:48
von derschutzhund
ts-soft hat geschrieben:Das ForEach bei jedem MouseMove ist doch wohl etwas overkill :wink:
Da kocht die CPU :lol:
Das würde ich eher nur bei einem Mouseklick feststellen, wo sich die Mouse befindet.
Ich habe es gerne warm! 8)
Nein im Ernst das werde ich mir mal ansehen. Mein Gedanke war die Infos zu jedem Tag automatisch beim Überfahren anzeigen zu lassen.
Da es ja maximal 365 Elemente sind sollte das doch eigentlich nicht zum Kochen führen?
Ich behalte es auf jeden Fall im Auge!

Ach bei der Gelegenheit, wie kann ich bei Bedarf ein kleines Fenster z.B. zum Einstellen der Farben anzeigen lassen.
Dazu benötige vermutlich ein zweites pbf oder?
Also es geht mir um die Erzeugung eines Auswahlfensters.
Das habe ich bisher immer umgangen in dem ich alle Textfelder etc. immer am Rand ständig anzeigen lasse.

EDIT: Habe es gerade unter Windows mit CoreTemp getestet. Selbst wenn ich die Maus extrem schnell und lange über den Kalender bewege ändert sich die Temperatur der CPU nicht um 1 Grad! Werde nochmal unter Linux testen.

Re: Mouseoverfunktion gesucht

Verfasst: 09.09.2013 19:07
von ts-soft
derschutzhund hat geschrieben:Da es ja maximal 365 Elemente sind sollte das doch eigentlich nicht zum Kochen führen?
Ich behalte es auf jeden Fall im Auge!
Naja, aber wieviel Mousemoves benötigt es, von einem Feld zum nächstem zu kommen?
Weil, frühestens, wenn Du ein anderes Feld erreicht hast, brauchste das ForEach, weil sich
ansonsten, ausser der Mouseposition nichts ändert.
Also bei Mousemove nur vergleichen, ob Du den nächsten Bereich erreicht hast, jedenfalls nur
das allernötigste dort machen, weil es gibt sehr viele Mousemoves, in sehr kurzen Abständen.